为什么 1%0.1 有余数

2015 年 10 月 10 日
 just1

http://i13.tietuku.com/7b11748d1d3f7b41.png
在 javascript 里面 1%0.1=0.09999999999999995???不懂。
新人求教,谢谢。

4518 次点击
所在节点    JavaScript
14 条回复
blahgeek
2015 年 10 月 10 日
因为这是 javascript (逃🙈
CRVV
2015 年 10 月 10 日
怎么老有人问这个问题
这和 Javascript 没有关系...
因为
> (0.1).toPrecision(21)
'0.100000000000000005551'
这个东西的原因,是二进制有限小数和十进制有限小数能表示的数字不是同一个集合
0.1 不能用有限二进制小数准确表示
比如三进制的 0.1 ,用十进制表示是 0.333333333...,一个道理
just1
2015 年 10 月 10 日
@CRVV 感谢回答,不过操作时怎么解决呢
hahasong
2015 年 10 月 10 日
@just1 精确数学运算,各语言都有专门的库
just1
2015 年 10 月 10 日
@CRVV 发现自己孤陋寡闻..
YuJianrong
2015 年 10 月 10 日
因为 JS 里的 number 就是 C/Java 的 double 。

(不要提位运算,那是特例。
just1
2015 年 10 月 10 日
于是取余数要这样子吗
9-Math.floor(9/4)*4
CRVV
2015 年 10 月 10 日
@just1
我觉得比较简单的办法是都乘 10 转成整数再来算
但是 JavaScript 本身没有整数,要乘 10 再约成整数
YuJianrong
2015 年 10 月 10 日
@just1 取余操作本来就应该仅针对两个整数操作,很多语言里根本就不能对浮点数取余, JS 能为浮点取余只是为了让 API 看起来更合理而已。
just1
2015 年 10 月 10 日
@YuJianrong
@CRVV 灰常感谢你们的回答:)
msg7086
2015 年 10 月 11 日
0.1 在二进制里是个无限小数,无法精确表示。
johnnyb
2015 年 10 月 11 日
lincanbin
2015 年 10 月 11 日
IEEE754
w88975
2015 年 10 月 12 日
@johnnyb 这个 666666666

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

https://v2ex.ih06.com/t/227025

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

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

© 2021 V2EX