为毛 JS 的浮点这么鬼畜的啊

2016-08-01 18:08:13 +08:00
 outlaws

var a = 0.05
a += 0.01

这时候 a 会等于 0.060000000000000000000005

6737 次点击
所在节点    JavaScript
45 条回复
luban
2016-08-01 18:10:55 +08:00
二进制保存小数问题,基本上编程语言都有类似的问题
lovedebug
2016-08-01 18:10:57 +08:00
JS 是双精度浮点数,用的 IEEE754 ,因而浮点数数值计算本来就不可能精确
zoudm
2016-08-01 18:17:24 +08:00
因为浮点数是实数的近似表示。计算的时候就会产生误差。跟具体什么语言没有关系。

C 里面可以自己决定使用 32 位的 float 或 64 位的 double , python 默认都是 64 位的浮点数。

定义一个 double d = 0.1 ,再 printf("%.20lf", d),就可以知道浮点数是无法准确表示 0.1 的。
CodingPuppy
2016-08-01 18:18:20 +08:00
跟语言没关系
br00k
2016-08-01 18:27:12 +08:00
和语言没关系
InFaNg
2016-08-01 19:14:44 +08:00
js 日常背锅
laoyur
2016-08-01 19:24:20 +08:00
In [1]: a = 0.05

In [2]: b = 0.01

In [3]: a + b
Out[3]: 0.060000000000000005

Python 表示这个锅有 js 帮背,真舒坦
exoticknight
2016-08-01 19:34:03 +08:00
心痛 js
SourceMan
2016-08-01 19:48:10 +08:00
日常背锅
aristotll
2016-08-01 19:48:43 +08:00
Js 表示虽然我设计的差 但真不是我的锅啊
FrankFang128
2016-08-01 19:51:38 +08:00
楼主找 block 么
billlee
2016-08-01 19:58:39 +08:00
自己计算机基础都没学好,还怪 js
iVanilla
2016-08-01 20:12:05 +08:00
我用 PHP 无法还原这个过程,不知什么原因。
<?php
$a = 0.05;
$a += 0.01;
echo $a;
?>
输出: 0.06
YuJianrong
2016-08-01 20:17:45 +08:00
@iVanilla 因为转成十进制字符串的保留小数位数不同……

LZ 标题都说 JS 的“浮点”(而不是官方听起来有些模糊的“数字” Number )了,还说这些难道是钓鱼?
这钩也太直了吧。
iVanilla
2016-08-01 20:25:13 +08:00
@YuJianrong 如果数值大一些, PHP 也可以出现类似现象,鸟哥在他的博客有解释: http://www.laruence.com/2013/03/26/2884.html

如果说这帖子是钓鱼的话,只能说钩直饵咸。
11138
2016-08-01 20:25:36 +08:00
@iVanilla
<?php
$a = 1.002;
$a -= 1.001;
echo $a;
?>
justjavac
2016-08-01 20:29:00 +08:00
zhanglintc
2016-08-01 20:34:15 +08:00
不知道你有没有听说过一个网站:
http://0.30000000000000004.com/
iVanilla
2016-08-01 20:35:41 +08:00
@11138 这个确实可以,但 LZ 这个用 PHP 怎么试都还原不出来,我尝试加大小数位数都不能复现。
原因不明。
iVanilla
2016-08-01 20:41:56 +08:00
@zhanglintc 看了你这个链接之后用 PHP 复现成功。
<?php
ini_set('precision', 17);
$a = 0.05;
$a += 0.01;
echo $a;
?>

官方的解释: http://php.net/manual/zh/ini.core.php#ini.precision
浮点数中显示有效数字的位数。

我看了下, PHP7 的默认值是 14.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296409

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX