Javascript toFixed()函数背后的规则是什么
我正在测试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
(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条)
功能修复(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
。