4

关于其中的著名问题 1.01+1.022.0300000000000002

一种解决方法是使用toFixed:例如

(1.01+1.02).toFixed(2) --->"2.03"

但我看到了 toPrecision 的解决方案

parseFloat((1.01+1.02).toPrecision(10))-->"2.03"

n但是让我们看看

  • toFixed(n)

  • toPrecision(n)

我怎么知道 n 是什么?

  0.xxxxxxxxxxx
+
  0.yyyyyyyyyyyyy
---------------------
  0.zzzzzzzzzzzzzzzzzzzzzzzzz
                ^ 
                |
-----??????------

添加的每个数字都可以有不同的十进制数字...

例如 :

1.0002+1.01+1.03333--> 3.0435300000000005

我将如何计算n这里?这个(特定)问题的最佳做法是什么?

4

4 回答 4

1

对于在这种情况下的加法,我会检查每个操作数中的小数位数。

在最简单的情况下,小数位数最多的操作数的小数位数是 n 的值。

一旦你有了这个,使用你喜欢的任何方法来截断你的值。然后摆脱尾随零。

在 1.06 + 1.04 等情况下,您可能会遇到尾随零,第一步将带您到 1.10,然后截断零将得到 1.1

在您的最后一个示例中,1.0002+1.01+1.03333 最大小数位数为 5,因此您剩下 3.04353 并且没有尾随零要截断。

于 2012-11-29T08:34:59.920 回答
0

这将返回预期的输出:

function add(){
    // Initialize output and "length" properties
    var length = 0;
    var output = 0;
    // Loop through all arguments supplied to this function (So: 1,4,6 in case of add(1,4,6);)
    for(var i = 0; i < arguments.length; i++){
        // If the current argument's length as string is longer than the previous one (or greater than 0 in case of the first argument))
        if(arguments[0].toString().length > length){
            // Set the current length to the argument's length (+1 is to account for the decimal point taking 1 character.)
            length = arguments[0].toString().length +1;
        }
        // Add the current character to the output with a precision specified by the longest argument.
        output = parseFloat((output+arguments[i]).toPrecision(length));
    }
    // Do whatever you with with the result, here. Usually, you'd 'return output;'
    console.log(output);
}
add();                     // Returns 0
add(1,2,3);                // Returns 6
add(1.01,2.01,3.03);       // Returns 6.05
add(1.01,2.0213,3.3333);   // Returns 6.3646
add(11.01,2.0213,31.3333); // Returns 44.3646

parseFloat甚至为您摆脱尾随零。

此函数接受任意数量的数字作为参数,然后在添加它们时将这些数字相加,同时考虑数字的字符串长度。添加中使用的精度会动态修改以适应“当前添加的”参数的长度。

小提琴

于 2012-11-29T08:40:14.360 回答
0

如果你在做计算,你有几个选择:

  • 将数字乘以例如 100,以转换为整数,然后进行计算,然后再次转换回来
  • 做计算,不用担心舍入误差,然后在显示时舍入结果

如果您正在处理货币/货币,第一个选择可能不是一个坏选择。如果你只是在做科学数学,我个人不会担心,只需在显示时将结果四舍五入,例如到 6 个有效数字,这是我的 c++ 编译器的默认值(gcc;不确定它是否在 c++ 中标准与否,但如果您1.234567890在 gcc c++ 中打印,则输出为1.23457,并且可以避免问题)

于 2015-03-15T09:51:25.073 回答
0
var a = 216.57421;

a.toPrecision(1); // => '200' because 216 with 1 < 5;
a.toPrecision(2); // => '220' because 216 with 6 >= 5;

a.toFixed(1); // => 216.6 because 7 >= 5;
a.toFixed(2); // => 216.57 because 4 < 5;
于 2016-09-09T03:51:22.267 回答