javascript - Javascript 中的数学错误 : safe to use JS for important stuff?

标签 javascript floating-point rounding native-code

我很无聊,所以我开始在控制台中摆弄,偶然发现了这个(忽略语法错误):

js in Chrome console

一些变量“测试”有一个值,我乘以 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/

相关文章:

python - 将嵌套循环计算转换为 Numpy 以加快速度

iphone - Apple A5 和 Apple A6 CPU 之间的浮点确定性

将数字四舍五入到前 3 位数字(以数字开头!= 0)

javascript - C# - Zoom GeckoWebBrowser (GeckoFX 45) 就像在 Mozilla Firefox 中一样

javascript - lua中同时定义和调用函数

javascript - 开源 HTML5 在线 Powerpoint 查看器

javascript - Cloud Endpoints 拒绝来自 javascript 前端的浮点值

r - summary() 舍入

Angular 2 - 如何轮计算数字?

javascript - JavaScript 中的跨域数据访问