为什么 1%0.1 有余数

2015-10-10 21:58:05 +08:00
 just1

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

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

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

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

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

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

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

© 2021 V2EX