Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript toFixed()函数背后的规则是什么_Javascript_Function_Tofixed - Fatal编程技术网

Javascript toFixed()函数背后的规则是什么

Javascript toFixed()函数背后的规则是什么,javascript,function,tofixed,Javascript,Function,Tofixed,我正在测试javascript的toFixed()方法。结果如下所示 (49.175).toFixed(2) => "49.17" (49.775).toFixed(2) => "49.77" (49.185).toFixed(2) => "49.19" (49.785).toFixed(2) => "49.78" (49.1175).toFixed(3) => "49.117" (49.1775).toFixed(3) => "49.178" (49.11

我正在测试javascript的toFixed()方法。结果如下所示

(49.175).toFixed(2) => "49.17"
(49.775).toFixed(2) => "49.77"
(49.185).toFixed(2) => "49.19"
(49.785).toFixed(2) => "49.78"

(49.1175).toFixed(3) => "49.117"
(49.1775).toFixed(3) => "49.178"
(49.1185).toFixed(3) => "49.118"
(49.1785).toFixed(3) => "49.178"
我在chrome浏览器上做了这个测试,结果让我很惊讶。我听不懂逻辑。它既不适合“从零开始四舍五入”也不适合“从零开始四舍五入”。 “toFixed()”函数背后的规则是什么

大约固定

返回一个字符串,该字符串包含以小数点后带有fractionDigits的十进制定点表示法表示的此数值。如果未定义fractionDigits,则假定为0。具体而言,请执行以下步骤:

算法
Number.prototype.toFixed(fractionDigits)

  • toFixed方法的长度属性为1

    • 如果使用多个参数调用toFixed方法,则行为未定义(参见第15条)
对于小于0或大于20的fractionDigits值,允许实现扩展toFixed的行为。在这种情况下,toFixed不一定会为这些值抛出RangeError

注意对于某些值,toFixed的输出可能比toString更精确,因为toString只打印足够的有效数字来区分数字和相邻的数字值

JS解决方案

功能修复(n,p){
返回(+(Math.round(+(n+'e'+p))++'e'+-p)).toFixed(p);
}
假设a=fix(49.1175,3);
假设b=fix(49.1775,3);
假设c=fix(49.775,2);
const random=Math.random();
console.log(示例a);
console.log(示例b);
console.log(示例c);
log('Before:',random,'After Custom=>',fix(random,3),'Default:',random.toFixed(3));
// 49.118
// 49.178
//49.78来自:

toFixed()。如果需要,数字将四舍五入,如果需要,小数部分将用零填充,以使其具有指定的长度。如果
numObj
大于或等于1e+21,此方法只需调用
Number.prototype.toString()
,并以指数表示法返回字符串

稍后您可以阅读:

警告:浮点数不能以二进制形式精确表示所有小数,这可能导致意外结果,例如
0.1+0.2===0.3
返回false


上述警告与舍入逻辑(可能对数字进行算术运算)相结合,将解释您在舍入过程中试验的不同行为(您可以阅读)。问题是,您输入的数字不存在!扫描时,它们(二进制)四舍五入到最接近的可能/现有数字
toPrecision(18)
显示扫描后更精确的数字:

(49.175).toPrecision(18); // "49.1749999999999972" => "49.17"
(49.775).toPrecision(18); // "49.7749999999999986" => "49.77"
(49.185).toPrecision(18); // "49.1850000000000023" => "49.19"
(49.785).toPrecision(18); // "49.7849999999999966" => "49.78"

因此,数字四舍五入2次:首先是扫描,然后是小数点后显示的位数;这可能是一个介于0和20之间(包括0和20)的值,并且实现可以选择支持更大范围的值。如果省略此参数,则将其视为0。如果数字太小或太大。介于0和100之间(含0和100)的值不会导致RangeError。您可以始终读取,但这些值具有真实值,与
0.1+0.2
问题不同。因此,我不能信任企业项目中的固定函数。@serefbilge如果你想获得精度,就不能信任十进制数之间的任何算术运算。我认为有些库在这种情况下可能会有所帮助,但您必须通过谷歌搜索并进行一些研究。@NinaScholz上显示了一个类似的示例,其中提到了显示舍入过程中不同行为的警告。如果您输入
fix(1.00499999999998,2)
,您的函数将失败。它返回
1.01