网上找的或多或少会有bug,经过调整修复以后真正满足生产环境如下:
function newToFixed(num,digit) {
let str = = (num*Math.pow(10, digit)).toString();
if (str.indexOf('.') == -1) {
str += ".";
for (var i = 1; i <= digit; i++) {
str += "0";
}
}
var dotIndex = str.indexOf('.');
if (parseInt(str.substr(dotIndex + 1, 1)) >= 5) {
if (parseInt(str.substring(str.indexOf('.') - 1, str.indexOf('.'))) != 9) {
str = str.substring(0, dotIndex - 1) + parseFloat(parseInt(str.substr(str.indexOf('.') - 1, 1)) + 1);
} else {
var i = 1;
var dotValue = parseInt(str.substr(str.indexOf('.') - i, 1));
while (dotValue == 9) {
i++;
dotValue = parseInt(str.substr(str.indexOf('.') - i, 1));
}
if (str.substring(0, dotIndex - i + 1) != "") {
str = str.substring(0, dotIndex - i) + parseFloat(parseInt(str.substr(dotIndex - i, 1)) + 1);
var num = dotIndex - str.length;
if (num > 0) {
for (var j = 0; j < num; j++) {
str += "0";
}
}
} else {
str = 1;
for (var j = 0; j < dotIndex; j++) {
str += "0";
}
}
}
} else {
var value = parseInt(str.substr(dotIndex + 1, 1));
if (value == 0) {
str = str.substring(0, str.indexOf('.') + 1) + "0";
} else {
str = str.substring(0, str.indexOf('.'));
}
}
return parseFloat(str) / Math.pow(10, digit);
}
|