js Number.prototype.toFixed 进行的舍入的算法没研究明白,应该不是四舍六入五成双,当然也不是四舍五入

下面是chrome与excel的对比

修改完之后的结果

对于“问题数据”的测试

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
Number.prototype.toFixed2 = function (decimal) {
// console.log(this, decimal)
if (Number(decimal) < 0 && Number(decimal) > 100) {
return RangeError('toFixed() digits argument must be between 0 and 100');
}
// 按小数点分割,得到整数位及小数位
// 按保留小数点位数分割小数位,得到需保留的小数位
// 将需保留的小数位与整数位拼接得到四舍五入之前的结果
// 对需四舍五入的小数最大一位数进行四舍五入,如果大于等于5则进位flag为1,否则为0
// 对四舍五入之前的结果+进位flag进行四舍五入得到最终结果 // 分割整数与小数
let cutArr = this.toString().split('.');
// 小数部分根据要保留的小数确定,如果小数部分长度小于要保留的精度缺失部分用0补全
let decimalStr = cutArr[1].length > decimal ? cutArr[1] : cutArr[1] + new Array(decimal - cutArr[1].length).fill('0');
// 是否进位
const plus = decimalStr.slice(decimal, (decimal+1)) >= 5 ? 1 : 0;
// 未四舍五入之前,(处理保留0位小数)
let mainArr = (cutArr[0] + (decimal > 0 ? ('.' + decimalStr.slice(0, decimal)) : ('' + decimalStr.slice(0, decimal)))).split('');
// 要输出的结果最后一位+是否要进位,
mainArr[mainArr.length - 1] = Number(mainArr[mainArr.length - 1]) + plus;
mainArr.reverse();
// 如果加完是10则向前进一位,否则直接输出
if (plus && mainArr[0] > 9) {
for (let i = 0; i < mainArr.length; i++) {
if (mainArr[i] > 9) {
if (mainArr[i + 1] != undefined && mainArr[i + 2] != undefined) {
if (mainArr[i + 1] === '.') {
mainArr[i + 2] = Number(mainArr[i + 2]) + 1;
} else {
mainArr[i + 1] = Number(mainArr[i + 1]) + 1;
}
}
mainArr[i] = 0
}
}
}
return mainArr.reverse().join().replace(/,/g, '')
}
// 测试
//
console.log('四舍六入五成双测试')
console.group();
console.log('(9.8350).toFixed(2)',(9.8350).toFixed(2),'(9.8350).toFixed(2)',(9.8350).toFixed2(2));
console.log('(1.335).toFixed(2)',(1.335).toFixed(2),'(1.335).toFixed(2)',(1.335).toFixed2(2));
console.log('(9.8250).toFixed(2)',(9.8250).toFixed(2),'(9.8250).toFixed(2)',(9.8250).toFixed2(2));
console.groupEnd();
console.log("四舍六入五成双测试");
console.log('数值计算测试')
console.group();
console.log('(0.1+0.2).toFixed(10)',(0.1+0.2).toFixed(10),'(0.1+0.2).toFixed(10)',(0.1+0.2).toFixed2(10));
console.log('(0.1+0.2).toFixed(2)',(0.1+0.2).toFixed(2),'(0.1+0.2).toFixed(2)',(0.1+0.2).toFixed2(2));
console.log('(2.0115 * 1000).toFixed(0)',(2.0115 * 1000).toFixed(0),'(2.0115 * 1000).toFixed(0)',(2.0115 * 1000).toFixed2(0));
console.groupEnd();
console.log("数值计算测试");
</script>
</body>
</html>

  补:

四舍六入五成双

具体规则如下

  (1)被修约的数字小于5时,该数字舍去;

  (2)被修约的数字大于5时,则进位;

  (3)被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。

  举例:

    9.8249=9.82, 9.82671=9.83

    9.8350=9.84, 9.8351 =9.84

    9.8250=9.82, 9.82501=9.83

js 四舍五入实现的更多相关文章

  1. js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数。

    js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数. <script language="javascript"> document.write(& ...

  2. js 四舍五入

    举例excel: ROUND 会四舍五入的:ROUNDDOWN 取小数点后两位数据,不管进位问题:ROUNDUP 取小数点后两位数据,只要有第三位小数都会进位的.关键看你取数的要求   在js如果要求 ...

  3. js四舍五入的bug和方法

    简单来说js使用原生toFixed(x)截取小数的时候会有误差,出现在比如var o = 0.3303;o.toFixed(3);//0.330 toFixed(x)本来也是一个获取四舍五入的截取方法 ...

  4. js 四舍五入函数 toFixed(),小数位数精度

    js的加减乘除有时得到的结果的小数的位数非常大,这种结果非常难以读取,例如某两个数相乘得到的结果是:1.3921000000000001 这种结果小数的位数有点多,一般需要的结果是四舍无入的 1.39 ...

  5. js 四舍五入保留二位小数

    1. 最笨的办法....... [我就怎么干的.........] function get() { var s = 22.127456 + ""; var str = s.sub ...

  6. js四舍五入

    7-13 向上取整ceil() 7-14 向下取整floor() 7-15 四舍五入round() 7-16 随机数 random()

  7. JS四舍五入保留两位小数

    //四舍五入保留2位小数(若第二位小数为0,则保留一位小数) function keepTwoDecimal(num) { var result = parseFloat(num); if (isNa ...

  8. JS 四舍五入有小数点

    后台传值 先整数化 var a = parseInt(10); var b = parseInt(3); var c = (a / b).toFixed(3)*100; 除之后进行小数点截取后三位再* ...

  9. javascript 四舍五入; js 四舍五入

    方法 Math.round round() 方法可把一个数字舍入为最接近的整数. 对于 0.5,该方法将进行上舍入. 例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3. Math.round( ...

随机推荐

  1. Mariadb-10.2.25 多实例

    Mariadb-10.2.25 多实例 定义目录 mkdir -p /mysql/{3306,3307,3308}/{bin,data,etc,log,pid,socket} 生成数据库文件 /app ...

  2. oracle中带参存储过程的使用

    Oracle中存储过程带参分为:输入参数(in)和输出参数(out) 例如: create or replace procedure out_test(v_user in emp.user_name% ...

  3. python代码技术优化

    numba 编译优化 from numba import jit @jit def eval_mcc(y_true, y_prob, threshold=False): idx = np.argsor ...

  4. mysql SQL优化琐记之索引

    equal最好了,其次in,最后是range !=  <>  这类非操作尽量不用,它会转换为range.>都是范围查询 复合索引有左匹配原则,(clo_a,clo_b)相当建立了两个 ...

  5. rsync配置文件模板

    用脚本实现服务端rsyncd的部署cat /server/scripts/rsync_install.sh #!/bin/bash #安装包 yum install -y rsync &> ...

  6. 广义线性模型|logistics|Odds ratio|最大似然函数|LR|AIC|

    广义线性模型 y是分类变量 Link function:将分类变量和数值变量放在一起 使用得到结果0 or 1的概率值来评估选0 or1 函数关系: 正比例函数: logistics函数S型曲线: O ...

  7. [tire+最短路]Bless You Autocorrect!

    [tire+最短路]Bless You Autocorrect! Typing on phones can be tedious. It is easy to make typing mistakes ...

  8. Python 语言基础

    Python 语言基础 Python 开发环境 计算机组成 编程语言(计算机语言)是人们为了控制计算机,而设计的一种符号和文字的组合,从而实现向计算机发出指令. 形式是符号和文字的组合 目的是为了控制 ...

  9. BaseAdapter教程(2) BaseAdapter的notifyDataSetChanged动态刷新

    遇到了这麽一个需求,ListView滑到最底,然后会自动在底部加入新的Cell,实现动态刷新. 1. 首先,为ListView加上setOnScrollListener. lvHomePostItem ...

  10. vue中的路由传参及跨组件传参

    路由跳转   this.$router.push('/course'); this.$router.push({name: course}); this.$router.go(-1); this.$r ...