请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
在JavaScript中,当从float转换为字符串时,如何在小数点后只获得2位数?例如,0.34而不是0.3445434.
当数字变大时,JavaScript会将大型INT转换为科学记数法.我怎样才能防止这种情况发生?
这是软件版本号:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Run Code Online (Sandbox Code Playgroud)
我该如何比较?假设正确的顺序是:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Run Code Online (Sandbox Code Playgroud)
这个想法很简单......:读取第一个数字,然后读取第二个数字,然后读取第三个数字....但是我无法将版本号转换为浮点数....你也可以看到版本号就像这个:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
Run Code Online (Sandbox Code Playgroud)
这更清楚地看到背后的想法是什么......但是,如何将其转换为计算机程序?有没有人知道如何排序这个?谢谢.
我刚刚发现ECMAScript 7功能a**b作为Math.pow(a,b)(MDN参考)的替代方案,并且在该帖子中遇到了一个讨论,其中他们显然表现不同.我在Chrome 55中测试了它,可以确认结果有所不同.
Math.pow(99,99) 回报 3.697296376497263e+197
而
99**99 回报 3.697296376497268e+197
因此记录差异会Math.pow(99,99) - 99**99导致-5.311379928167671e+182.
到目前为止可以说,它只是另一种实现,但将它包装在一个函数中的行为又有所不同:
function diff(x) {
return Math.pow(x,x) - x**x;
}
Run Code Online (Sandbox Code Playgroud)
调用diff(99)返回0.
为什么会这样?
正如xszaboj指出的那样,这可以缩小到这个问题:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
Run Code Online (Sandbox Code Playgroud) 我y在javascript中有大量的数值.我想通过将它们舍入到最接近的倍数来对它们进行分组x,并将结果转换为字符串.
如何绕过恼人的浮点精度?
例如:
0.2 + 0.4 = 0.6000000000000001
Run Code Online (Sandbox Code Playgroud)
我尝试了两件事:
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
Run Code Online (Sandbox Code Playgroud)
和:
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
Run Code Online (Sandbox Code Playgroud) javascript floating-point double floating-accuracy numerical-methods
我试图将十进制数截断为小数位.像这样的东西:
5.467 -> 5.46
985.943 -> 985.94
Run Code Online (Sandbox Code Playgroud)
toFixed(2)做正确的事情,但它完成了价值.我不需要四舍五入的值.希望这在javascript中是可能的.
我想要的是与Number.prototype.toPrecision()几乎相反,这意味着当我有数字时,它有多少小数?例如
(12.3456).getDecimals() // 4
Run Code Online (Sandbox Code Playgroud) 为什么49.90 % 0.10在JavaScript中返回0.09999999999999581?我预计它会是0.
我认为 JavaScript 的松散相等运算符很好,让我可以将 Numbers 与 BigInts 进行比较:
42 == 42n // true!
Run Code Online (Sandbox Code Playgroud)
所以我尝试了一个大于Number.MAX_SAFE_INTEGER. 我认为由于数字会自动四舍五入,因此我可能还必须四舍五入 BigInt 才能将它们视为相等:
9999999999999999 == 10000000000000000 // true - rounded to float64
9999999999999999 == 9999999999999999n // false - makes sense!
10000000000000000 == 9999999999999999n // false - makes sense!
9999999999999999 == 10000000000000000n // true - makes sense!
Run Code Online (Sandbox Code Playgroud)
太好了,有道理——所以我尝试了另一个四舍五入的大数字:
18446744073709551616 == 18446744073709552000 // true - rounded to float64
18446744073709551616 == 18446744073709551616n // true?!
18446744073709552000 == 18446744073709551616n // true?!
18446744073709551616 == 18446744073709552000n // false?!
Run Code Online (Sandbox Code Playgroud)
我在 Chrome、Safari …