如何解决 js 计算 double 小数时候精度损失 bugs All In One
如何解决 js 计算 double 小数时候精度损失 bugs All In One
js double 精度损失 bugs
const arr = [
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01
];
// [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
arr.reduce((acc, i) => acc += i);
// 0.09999999999999999
arr = [
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01
]
(10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
arr.reduce((acc, i) => acc += i);
0.09999999999999999
sum = 0;
0
sum += 0.01;
0.01
sum += 0.01;
0.02
sum += 0.01;
0.03
sum += 0.01;
0.04
sum += 0.01;
0.05
sum += 0.01;
0.060000000000000005
sum += 0.01;
0.07
sum += 0.01;
0.08
sum += 0.01;
0.09
sum += 0.01;
0.09999999999999999
// 保留两位精度 ?
解决方案
- string 大数相加 / 大数相乘
arr = [
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01
];
(10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
arr.reduce((acc, i) => acc += Number.parseFloat(i).toFixed(2));
"0.010.010.010.010.010.010.010.010.010.01"
arr.reduce((acc, i) => acc += parseFloat(i.toFixed(2)));
0.09999999999999999
arr.reduce((acc, i) => acc += i.toFixed(2));
"0.010.010.010.010.010.010.010.010.010.01"
arr.map(i => i.toFixed(2));
(10) ["0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01"]
// string 大数相加, ??? 位运算
- 小数转整数
arr = [
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01
];
(10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
arr.map(i => i * 100).reduce((acc, i) => acc += i) / 100;
0.1
先按倍数扩大,后缩小还原 ✅
const arr = [
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01, 0.01, 0.01,
0.01
];
// multiple 倍数
const TIMES = 100;
let temp = arr.reduce((acc, i) => acc += i * TIMES, 0);
parseFloat((temp / TIMES).toFixed(2));
// 0.1
···
## 红包算法
## refs
> 最简单的方法实现微信红包的随机算法
https://www.cnblogs.com/xgqfrms/p/13688375.html
***
<div>
<a href="https://info.flagcounter.com/QIXi">
<img src="https://s11.flagcounter.com/count2/QIXi/bg_000000/txt_00FF00/border_FF00FF/columns_3/maxflags_12/viewers_0/labels_1/pageviews_1/flags_0/percent_1/" alt="Flag Counter" border="0">
</a>
</div>
***
<blockquote style="display: flex; flex-flow: column; align-items: center; justify-content: center; text-align: center; border: none;">
<h3><strong><span style="font-size: 16pt; color: #00ff00;">©xgqfrms 2012-<span data-uid="copyright-aside">2020</span></strong></span</h3>
<p><span style="font-size: 18pt; color: #00ff00;"><strong>www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!</strong></span></p>
</blockquote>
***
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/13689522.html
未经授权禁止转载,违者必究!