JS中的Math.trunc()以及浅谈js计算失精常用函数

目录

【mdn中关于Math.trunc()的描述】:

【场景】

【常用的其他函数以及其效果】

1.Math.round()

 2.Math.ceil()

3.Math.floor()

4.Math.trunc()

5.Number.prototype.toFixed()--“toFixed的四舍六入五成双”

6.Number.prototype.toPrecision()


【mdn中关于Math.trunc()的描述】:

不像 Math 的其他三个方法: Math.floor()Math.ceil()Math.round() ,Math.trunc() 的执行逻辑很简单,仅仅是删除掉数字的小数部分和小数点,不管参数是正数还是负数。

传入该方法的参数会被隐式转换成数字类型。

链接:Math.trunc() - JavaScript | MDN

【场景】

js涉及小数的运算出现失去精度的结果

【常用的其他函数以及其效果】

1.Math.round()

Math.round() 函数返回一个数字四舍五入后最接近的整数。

·重点:四舍五入、以及在负数时的表现(特殊值-0.5)

x = Math.round(20.49);   //20 (只判断0.4的这个十分位)
x = Math.round(-20.49);  //-20 (倘若是正数20.49,则舍入为20;因此-20.49舍入为-20,其计算原理是先取绝对值算四舍五入,最后加正负号)
x = Math.round(-20.5);   //-20 (特殊情况-0.5,此时是正方向舍入的入)
x = Math.round(-20.51);  //-21 (普通情况,-0.51,取绝对值。因为20.51舍入为21,所以-20.51舍入为-21)

 2.Math.ceil()

Math.ceil() 返回一个大于或等于给定数字的最小整数【即,向上取整】

console.log(Math.ceil(.0001));    // 1 ,正小数的话,如果整数位是0结果恒为1

console.log(Math.ceil(7.004));    // 8 ,大于1的正小数,则是一致的“进一”操作

console.log(Math.ceil(-0.9));      // 0 
console.log(Math.ceil(-1.1));      // -1 
console.log(Math.ceil(-2));        // -2 ,这三例负小数,是只计算正方向上的数值最接近的整数

3.Math.floor()

Math.floor() 返回小于或等于一个给定数字的最大整数【即,向下取整】

笔者的总结:正小数是去尾,负小数是“绝对值进一”

4.Math.trunc()

Math.trunc() 方法会“将参数隐式转换成数字类型后,纯粹的去除小数部分”

Math.trunc(.0001)    // 0
Math.trunc(-0.123)   // -0
Math.trunc("-1.123") // -1
Math.trunc(NaN)      // NaN
Math.trunc("foo")    // NaN
Math.trunc()         // NaN
Math.trunc("")       // 0   (这个要特别注意)

5.Number.prototype.toFixed()--“toFixed一定条件下的四舍六入五成双”

2024/6/24备注:此处的描述在一些场景下并不正确,可以参考别的高人的帖子进一步了了解JS 四舍五入方法 和 toFixed()最全总结(包括toFixed()的坑以及四舍五入实现方法)-CSDN博客

-------------------------------------------------------------------------------------------

使用定点表示法表示给定数字的字符串。

注意:返回值是一个字符串

numObj.toFixed(digits)

[digits]  小数点后数字的个数;介于 0 到 20 (包括)之间,实现环境可能支持更大范围。如果忽略该参数,则默认为 0。

2.34.toFixed(1);          // 返回 "2.3", digits的值是1,保留一位小数
-2.34.toFixed(1);         // 返回 -2.3 (由于操作符优先级,负数不会返回字符串)
(-2.34).toFixed(1);       // 返回 "-2.3" (若用括号提高优先级,则返回字符串)

2.34.toFixed(6);          // 返回 "2.340000", 用0填充。(此举可用于一些补零操作;比如整数临时化小数用toFixed补零,然后移除小数点)

//toFixed的四舍六入五成双
//——【四舍六入】

console.log(5.34.toFixed(1)); // 返回"5.3",保留1位小数,百分位<=4,直接去尾

console.log(5.36.toFixed(1)); // 返回"5.4",保留1位小数,百分位>=6,直接进一

//——【五成双】,以上面toFixed(1)为例,百分位是5的时候,需要特殊讨论:

console.log(5.351.toFixed(1)); // 返回"5.4",0.05后面有数字,直接进一

/*
if
  0.05后面没有数字 && 0.05前面是0、8,直接去尾
*/
console.log(5.05.toFixed(1)); // "5.0"
console.log(5.85.toFixed(1)); // "5.8"


/*
if
  0.05后面没有数字 && 0.05前面是奇数或者2、4、6,直接进一
*/
console.log(5.15.toFixed(1)); // "5.2"
console.log(5.35.toFixed(1)); // "5.3"
console.log(5.55.toFixed(1)); // "5.5"
console.log(5.75.toFixed(1)); // "5.8"
console.log(5.95.toFixed(1)); // "6.0"

console.log(5.25.toFixed(1)); // "5.3"
console.log(5.45.toFixed(1)); // "5.5"
console.log(5.65.toFixed(1)); // "5.7"

6.Number.prototype.toPrecision()

toPrecision() 方法以指定的精度返回该数值对象的字符串表示。

(简单来说,toPrecision()toFixed()都是四舍六入五成双,区别就是,toPrecision()的传参是包含整数位在内的所有位数,超出的部分补零)

//参数为空时,等同toString()
console.log(5.15.toPrecision());  // "5.15"
//参数的位数超出时,小数补零
console.log(5.15.toPrecision(4)); // "5.150"
console.log((5).toPrecision(4));  // "5.000",如果仅提供证整数,则该整数需要加括号

// 精确到十分位 && 百分位是5 && 十分位是奇数或者2、4、6
console.log(5.15.toPrecision(2)); // "5.2"
console.log(5.35.toPrecision(2)); // "5.3"
console.log(5.55.toPrecision(2)); // "5.5"
console.log(5.75.toPrecision(2)); // "5.8"
console.log(5.95.toPrecision(2)); // "6.0"

console.log(5.25.toPrecision(2)); // "5.3"
console.log(5.45.toPrecision(2)); // "5.5"
console.log(5.65.toPrecision(2)); // "5.7"

// 精确到十分位 && 百分位是5 && 十分位是0、8
console.log(5.05.toPrecision(2)); // "5.0"
console.log(5.85.toPrecision(2)); // "5.8"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devwolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值