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. 时间API

    1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还 ...

  2. Window命令行切换命令

    Windows 命令行切换目录 特别注意:切换到其它盘符不需要 cd 命令 1. 切换到 C 盘根目录 打开终端 cmd 后,输入cd C:\(一定要加上后面的反斜扛) 2.切换到 C 盘子目录 打开 ...

  3. 黑马eesy_15 Vue:03.生命周期与ajax异步请求

    黑马eesy_15 Vue:02.常用语法 黑马eesy_15 Vue:03.生命周期 黑马eesy_15 Vue:04.Vue案例(ssm环境搭建) vue的生命周期与ajax异步请求 1.Vue的 ...

  4. Git-GitHub-GitLab三者之间的联系及区别

    在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便 ...

  5. metinfo_5.3变量覆盖引发的一系列问题

    metinfo_5.3中存在一个很经典的$$型变量覆盖,这种变量覆盖在之前的博客中提到过,今天的博客围绕这个变量覆盖漏洞结合这款CMS的其他功能进行漏洞利用. 变量覆盖+文件包含 拿到这个CMS首先还 ...

  6. Java快速输入输出

    一.StreamTokenizer实现快速输入 需要的jar包 import java.io.BufferedReader;import java.io.IOException;import java ...

  7. iOS keychain报错 25293

    经过查找发现25293对应的错误是如下,即用户名和密码不正确. errSecAuthFailed                         = -25293,    /* The user na ...

  8. 36)PHP,搜寻数据库信息在html中显示(晋级1)

    首先是数据库的样子展示: 然后就是我的PHP主文件了: <?php class db { public $host="localhost" ;//这个是主机的地址 publi ...

  9. AngularJs 中ngModel绑定HTML5 date数据同步问题

    以下代码例子中,直接将date类型的input标签与ng-model对应的变量绑定,会出现内存数据和页面数据不一致的问题.虽然AngularJS是双向数据绑定,但是如果用下面的方法,在页面更新date ...

  10. http接口与webservice接口的区别

    常见的API接口有两类:http接口和webservice接口. http接口走http协议,通过路径来区分调用方法,请求报文一般是key-value形式的,返回报文一般是json串,常用的是get和 ...