gpt4 book ai didi

JavaScript - 在什么操作之后需要 toFixed() 以及应该传递什么参数?

转载 作者:行者123 更新时间:2023-12-02 12:40:20 33 4
gpt4 key购买 nike

来自讨论herehere我们看到 toFixed() 可用于在处理二进制 float 时帮助保持精度。

出于各种原因,我不想使用第三方库。然而,对于任何可以表示为 64 位内有限小数的分数,我希望以最通用的方式保持最大精度。

假设我使用toFixed(),什么时候需要使用它?是否有一个“最佳”参数可以传递给它来实现上述目标?

例如,考虑 JavaScript 在不同运算后将分数 1/10 表示为有限小数的能力:

10/100        = 0.1
0.09 + 0.01 = 0.09999999999999999
1.1 - 1 = 0.10000000000000009

第一个不需要校正步骤,而后两个则需要。此外,在这种情况下,向 toFixed() 传递值 15 是有效的(例如:Number((0.09 + 0.01).toFixed(15))):

10/100        = 0.1
0.09 + 0.01 = 0.1
1.1 - 1 = 0.1

但超过 16 则不会:

10/100        = 0.1
0.09 + 0.01 = 0.1
1.1 - 1 = 0.1000000000000001

尝试JSFIDDLE .

将 15 作为 toFixed() 的参数总能实现上述目标吗?更重要的是,我什么时候必须调用toFixed()?除了加、减、乘和除之外,我的数学例程还使用 Math.pow()Math.exp()Math.log()

最佳答案

何时可能出现不准确的情况:

除非深入了解 IEEE-754 double 浮点的技术细节,并让您的代码根据其所操作的两个值的特定特征进行定制,否则您将不知道结果何时会不准确;任何操作,包括简单的加法,都可能导致不准确的结果(如著名的 0.1 + 0.2 = 0.30000000000000004 示例)。

关于要传递给 toFixed 的数字:

您可以使用toFixed(然后转换回数字)进行四舍五入(正如您在问题中所说的那样),但是您应该使用的位数取决于您需要的精度结果以及您正在使用的值的范围。从根本上讲,您需要确定需要多少精度,然后使用舍入以最佳精度实现该精度,因为 IEEE-754 浮点不可能在整个值范围内获得完美的精度(如您所知)。总共大约有 15 位有效数字;您需要决定如何在小数点左右两侧分配它们。

但是,假设您的“正常”值范围小于 100 亿,例如四位或五位小数,您可以使用 5,因为这会给您左侧大约 10 位数字右边五位数字。

以著名的例子为例:

function roundToRange(num) {
return +num.toFixed(5);
}

snippet.log(roundToRange(0.1 + 0.2)); // 0.3, rather than the usual 0.30000000000000004
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

当然,四舍五入的结果可能并不完美,因为一整类以 10 为基数的小数无法用 2 为基数(IEEE-754 使用的)准确表示,因此必须 是近似的,但是通过在您的范围内工作,您可以防止来自范围之外的不精确性相加(或相乘!)。

关于JavaScript - 在什么操作之后需要 toFixed() 以及应该传递什么参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624507/

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