最近在进行浮点数运算的时候经常遇见精度问题,基本原理我也知道了,就是一些小数使用二进制表示的时候是无穷多位的,一个浮点数的64位没办法全部表示,导致出现误差。这样的话,二进制的加法和减法出现误差也是同理。比如0.7 + 0.1
0.7 - 0.43
等。
在乘法和除法运算的时候也会出现这个问题,但是我对二进制的乘法和除法不了解,网上的资料也看不大懂。为什么81.6 * 10
81.6 * 100
结果也不一样。大家可以在浏览器 console 里面试一下。
因为最近看到一段 js 代码是这样处理问题的,
function accAdd(arg1, arg2) {
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split(".")[1].length
} catch (e) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2));
return (arg1 * m + arg2 * m) / m;
}
一个小数点后面 n 位的小数乘以10的 n 次方是否一定是一个能准确表达的数值呢?为什么乘以比10的 n 次方还大的数字(比如100)却有问题呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.