请考虑以下代码:
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)
为什么会出现这些不准确之处?
根据标准ES 将数字实现为 IEEE754 双倍。
每https://www.binaryconvert.com/result_double.html?decimal=053055050054055049056048053048053054056053048051050057054和其他编程语言https://play.golang.org/p/5QyT7iPHNim它看起来像5726718050568503296
值可以精确表示不失精度。
为什么它在 JS 中丢失了 3 个有效数字(在最新的稳定版 google chrome 和 firefox 中转载)
这个问题最初是从golang 中的复制 javascript 不安全数字触发的
该值在双 IEEE754 中绝对可以表示,请参阅 Go 中如何将裸位转换为 float64:https : //play.golang.org/p/zMspidoIh2w
自 20 世纪 90 年代起,人们就知道如何快速准确地打印浮点数。Scheme和Java编程语言已经实现了这个算法,但我在C++中找不到类似的东西。
本质上,我正在寻找一小段高效的代码来满足以下测试用例:
void test(double dbl, const char *expected) {
std::string actual = ...;
assert(actual == expected);
}
test(3.0, "3.0");
test(3.1, "3.1");
test(0.1, "0.1");
test(1.0 / 3.0, "0.3333333333333333"); // Or maybe one more digit?
Run Code Online (Sandbox Code Playgroud)
双精度字面值会转换为浮点数,浮点数可能与字面值相同,也可能不同。然后,浮点数被转换回字符串。该字符串应尽可能短,同时表示十进制数,当解释为双精度文字时,将再次产生相同的浮点数。
如何使用 cout 以全精度打印双精度值?看起来相关,但接受的答案中的代码无法正确处理 3.1 情况。
0.1 + 0.2
// => 0.30000000000000004
0.2 + 0.2
// => 0.4
0.3 + 0.2
// => 0.5
Run Code Online (Sandbox Code Playgroud)
我知道这与浮点有关,但这里到底发生了什么?
根据@Eric Postpischil 的评论,这不是重复的:
那只涉及为什么“噪音”出现在一个附加项中。这个人问为什么“噪音”出现在一个加法中而没有出现在另一个加法中。这在另一个问题中没有回答。因此,这不是重复的。事实上,差异的原因并不是浮点运算本身,而是ECMAScript 2017 7.1.12.1 step 5
我正在尝试编写一个函数,使用此处的答案作为参考,获取浮点文字中小数点后的小数位数。
尽管在浏览器控制台中尝试时这似乎工作正常,但在 Node.js 环境中运行测试用例时,精度最多仅被截断 14 位。
let data = 123.834756380650877834678
console.log(data) // 123.83475638065088
Run Code Online (Sandbox Code Playgroud)
该函数返回 14 作为答案。
为什么在休息时进行舍入?这是默认行为吗?
我知道 JavaScript 中的浮点值以 IEEE 754 中指定的二进制 base-2 格式存储。对我来说,这意味着当我将文字值分配给.1
变量时,实际存储的值将是 0.100000001490116119384765625(或一些高像这样的精确数字——我的数学可能是错误的)。
但是与该假设相反,console.log
存储值的 不反映这一点。以下代码:
var a = 0.1;
console.log(a);
...在 Chrome 和其他浏览器中执行时,将输出:
0.1
我本来希望它是:
0.100000001490116119384765625
此时的值是否a
成立0.1
或0.1000000...
?如果是后者,那么通过什么方式console.log()
显示0.1
?我对这里发生的事情很感兴趣。(例如,JS 是否在变量中存储了数字的文本表示?)
对于可能会很快“标记为重复”的勤奋管理员,请注意,我问的问题与更常见的问题和变体“为什么我突然看到这些古怪的高精度数字相反?”