【问题标题】:JavaScript multiplying by 100 giving weird result [duplicate]JavaScript乘以100给出奇怪的结果[重复]
【发布时间】:2014-02-23 17:17:11
【问题描述】:

我有:

var a =  0.0532;
var b =  a * 100;

b 应该返回 5.32,但它返回的是 5.319999999999999。我该如何解决这个问题?

JSFiddle 这里: http://jsfiddle.net/9f2K8/

【问题讨论】:

  • 这里有一个解决方案:JavaScript function moveComma(val, moveCommaByInput) { if (val || typeof val === 'number') { const valueNumber = Number(val); const moveCommaBy = moveCommaByInput || 0; if (isNaN(valueNumber)) { return null; } else { return Number(`${valueNumber}e${moveCommaBy}`); } } return null; }

标签: javascript multiplication


【解决方案1】:

这不是错误。

Javascript 试图以尽可能高的精度表示5.32。由于计算机没有无限精度,它会选择最接近的数字:5.319999999999999

如果您的问题在于数值运算,您应该能够毫无问题地添加/相乘/等这些数字。它们非常接近预期的数字,结果将在可忽略不计的误差范围内。

如果您的问题在于比较数字,常见的方法是放弃==,而是使用定义的误差范围进行比较。例如:

// Two previously obtained instances of the "same" number:
a = 5.32
b = 5.319999999999999

// Don't do this:
if (a == b) {}

// Do this instead (hide it in a function):
margin = 0.000001
if (Math.abs(a - b) < margin) {}

如果您的问题是视觉上的,您可以使用toFixed() 创建一个圆形的人类可读字符串:

number = 123.4567
number.toFixed(2)
> '123.46'

【讨论】:

    【解决方案2】:

    你应该使用.toFixed()

    FIDDLE

    var a =  0.0532;
    var b =  a * 100;
    b.toFixed(2);     //specify number of decimals to be displayed
    

    【讨论】:

    • 我不知道我是否会假设2 作为.toFixed 的参数是安全的。如果a = 0.53245239934 怎么办?或b = 10?
    • @naomik 如果a = 0.53245239934 将返回0.5310.00 用于b
    • 我只是说您可能不想仅仅因为在这种特定情况下不会丢失数据而假设 2 是可接受的精度。
    • Number.prototype.toFixed 是一个用于格式化数字的函数。它返回一个字符串。如果您需要数字而不是字符串,请查看此答案stackoverflow.com/a/29494612/228770
    猜你喜欢
    • 2020-08-12
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2013-08-20
    • 2019-12-17
    相关资源
    最近更新 更多