gpt4 book ai didi

javascript - 您如何知道 JavaScript float 何时不会被舍入?

转载 作者:搜寻专家 更新时间:2023-11-01 05:27:16 25 4
gpt4 key购买 nike

我知道二进制 float 的特性,计算机无法将它们计算为四舍五入的数字。我想知道是否有任何“逻辑”来知道哪些 float 将被舍入,哪些不会被舍入?

例如,当我在控制台中运行 0.1 + 0.2 时,它会返回0.30000000000000004。然而,当我运行 0.1 + 0.3 时,它会正确返回 0.4。

是否有任何逻辑可以确定哪些特定的 float 不会“正确”舍入?

最佳答案

paul23's answer处理一般原则。本回答对问题中的具体情况进行了分析。

对于表示十进制数的每个字符串,四舍五入将产生特定的 64 位二进制 IEEE754 数。以下是问题中数字的映射:

0.1 0.1000000000000000055511151231257827021181583404541015625
0.2 0.200000000000000011102230246251565404236316680908203125
0.3 0.299999999999999988897769753748434595763683319091796875
0.30000000000000004 0.3000000000000000444089209850062616169452667236328125
0.4 0.40000000000000002220446049250313080847263336181640625

在转换为 float 时,0.1 和 0.2 都向上舍入,因此它们的和将大于 0.3。另一方面,0.3 向下舍入,因此总和大于最接近 0.3 的 float 。任一方向的舍入误差为 2.77555756156289135105907917022705078125E-17,但四舍五入规则导致四舍五入。

当添加 0.1 和 0.3 时,输入的舍入误差方向相反。确切的金额是0.3999999999999999944488848768742172978818416595458984375,恰好是可表示数字之间的一半0.399999999999999966693309261245303787291049957275390625 和 0.40000000000000002220446049250313080847263336181640625。舍入误差为 2.77555756156289135105907917022705078125E-17。

较大的位模式的十六进制表示是 3fd999999999999a,它是偶数,所以这就是四舍五入的方式。碰巧的是,这也是最接近 0.4 的 float 。

除非您将自己限制在可以用 64 位二进制 float 精确表示的数字上进行算术运算,否则很难预测哪些计算将获得最接近预期十进制计算的 float ,哪些不会。如果这很重要,那么您要么打印带有太多小数位的输出,要么您需要不同的数据类型。

关于javascript - 您如何知道 JavaScript float 何时不会被舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com