一、背景
web计算保留几位小数,很常见的问题
二、历程
- 以前都是自己写一堆代码转字符串再处理
- 是否可以找个npm包?
感觉是个好东西。。。
结果:垃圾!解决不了精度问题
三、正解
3.1 简单转字符法
var result = +(0.57 * 10000).toFixed(8)
3.2 通用法
function roundOf(n, p) {
const n1 = n * Math.pow(10, p + 1);
const n2 = Math.floor(n1 / 10);
if (n1 >= (n2 * 10 + 5)) {
return (n2 + 1) / Math.pow(10, p);
}
return n2 / Math.pow(10, p);
}
// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34
参考