我很无聊,所以我开始在控制台中摆弄,偶然发现了这个(忽略语法错误):
一些变量“测试”有一个值,我乘以 10K,它突然变成不同的数字(你可以称之为舍入误差,但这取决于你需要多少精度)。然后我将该数字乘以 10,它又变回/再次变回。
这给我提出了几个问题:
- Javascript 的准确性如何?这个确定了吗? IE。可以考虑的数字?
- 有办法解决这个问题吗? IE。在 Javascript 中完全准确地进行数学计算(在其数据类型的限制内)。
- 第二次操作后改变的数字应该解释为“变回原来的数字”还是“由于不准确而再次改变”?
我不确定这是否应该是一个单独的问题,但实际上我试图将数字四舍五入到小数点后的某个数量。我研究了一下,发现了两种方法:
> 方法 A
function roundNumber(number, digits) {
var multiple = Math.pow(10, digits);
return Math.floor(number * multiple) / multiple;
}
> 方法 B
function roundNumber(number, digits) {
return Number(number.toFixed(digits));
}
直觉上我更喜欢方法B(看起来更有效率),但我不知道幕后发生了什么所以我无法真正判断。有人对此有想法吗?还是一种基准测试方法?为什么没有原生的 round_to_this_many_decimals 函数? (一个返回一个整数,而不是一个字符串)
最佳答案
How in accurate is Javascript?
Javascript 使用标准 double float ,因此精度限制与使用它们的任何其他语言(大多数语言)相同。它是处理器用来处理 float 的 native 格式。
Is there a way to fix this? I.e. to do math in Javascript with complete accuracy (within the limitations of its datatype).
没有。精度限制在于数字的存储方式。 float 不具有完全的精度,因此无论您如何计算都无法达到绝对精度,因为结果返回到 float 。
如果您想要完全准确,那么您需要使用不同的数据类型。
Should the changed number after the second operation be interpreted as 'changing back to the original number' or 'changing again, because of the inaccuracy'?
又变了。
当数字转换为要显示的文本时,它会四舍五入到特定位数。看似准确的数字其实并不准确,只是没有显示出精度的局限性。
当数字“变回”时,这只是因为四舍五入再次隐藏了精度的限制。每次计算都会增加或减少数字中的小误差,有时恰好会使数字更接近您最初的数字。尽管它看起来更准确,但实际上不太准确,因为每次计算都会增加一些不确定性。
关于javascript - Javascript 中的数学错误 : safe to use JS for important stuff?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23500772/