ホームページ php教程 PHP源码 你可能知道但是会犯的错误,细节决定成败

你可能知道但是会犯的错误,细节决定成败

May 25, 2016 pm 05:07 PM

你或许知道强制转换会丢失精度,你或许了解或多或少类似的细节,你或许也有遗漏的细节
           1+1 = 2 
           3*(1/3) =1 没错 但是你给计算机试试 
           3*0.3333... =0.999999999 != 1 
           这就是细节,什么时候注意呢,得看情况了,比如是现金、利率时候就的注意了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<?php

 

echo (int)((0.1+0.0)*10); //1

echo"<br>";

echo (int)((0.1+0.1)*10); //2

echo"<br>";

echo (int)((0.1+0.7)*10); //7

echo"<br>";

echo (0.1+0.7); //0.8

echo"<br>";

echo intval((0.1+0.7) * 10); //7 而不是8

echo"<br>";

echo intval(bcadd(0.1,0.7,8)*10); //8

 

 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

仔细想下,你或许明白,但是我还是没明白,因为我笨,于是找到php。chm 给出一些解释

 

 

Warning

关于浮点数精度的警告

 

 显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9。

 

这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3。

 

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。

 

至于上面中的任意精度计算可参考php.chm

 

 bcadd — Add two arbitrary precision numbers

 string bcadd ( string $left_operand , string $right_operand [, int $scale ] )

ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)