最近在做一个前端计算器
关于 js 精度,网上教程大部分都是把小数处理成整数
然而
4246.77 * 100 = 4336.820000000001
请问一下大家一般怎么处理
1
chairuosen 2017-11-24 10:06:46 +08:00
把字符串里的点删了直接转 Number,然后通过点右边的长度判断倍数?
|
2
domty 2017-11-24 10:07:17 +08:00
看你保留几位小数了呗
比如保留两位小数就 乘 100 取整再除 100 |
5
minyress 2017-11-24 10:09:09 +08:00 1
(123.123456).toFixed(3)
|
6
Mutoo 2017-11-24 10:09:32 +08:00 1
1) 4246.77 * 100 = 424677.00000000006
2) 小数处理成整数指的是 4246.77 表示成 424677 * 10^-2 而不是去计算 4246.77 * 100 因为前者本身就无法用 ISO754 浮点数精确表示。 3) 此类问题应该使用高精度算法解决 |
7
fundon 2017-11-24 10:09:51 +08:00 1
|
8
hubert3 2017-11-24 10:10:59 +08:00
chrome 显示 4246.77 * 100 = 424677.00000000006
|
9
yangehappy 2017-11-24 10:13:35 +08:00
说一下场景吧
|
11
autoxbc 2017-11-24 10:15:06 +08:00 via iPhone 2
math.js ,不要自己硬写
|
12
gyteng 2017-11-24 10:16:55 +08:00
注意 toFixed 也是有坑的
|
13
wslsq OP |
14
mooncakejs 2017-11-24 10:22:58 +08:00
说的好像别的语言没这个问题一样。
|
15
wslsq OP @mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。
谢谢大家 不一一回复了 |
16
mooncakejs 2017-11-24 10:30:51 +08:00
@wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。
|
17
alen 2017-11-24 10:33:30 +08:00
<img alt="" src=" ">
|
18
hasbug 2017-11-24 10:34:51 +08:00
网上找别人的轮子来用。。我都这么解决,给力不
|
19
lybtongji 2017-11-24 10:38:47 +08:00
Firefox 显示正常
|
20
Elven 2017-11-24 10:50:34 +08:00 via iPhone
用现成的库呀,比如 math.js ,bn.js 什么的
|
21
moe3000 2017-11-24 10:51:07 +08:00
toFixed 或者别人写的运算库
|
23
zproo 2017-11-24 11:21:12 +08:00
|
24
rover5056 2017-11-24 11:24:37 +08:00
(*1000 +0.001)/1000
自己想的办法 有点妖但是很好用 |
25
rover5056 2017-11-24 11:25:13 +08:00
再 FIX 一下就好了
|
26
yuriko 2017-11-24 17:40:55 +08:00 1
大多数语言都会有的问题,本质就是浮点数小数部分转成二进制会无限循环,再转换回来的时候丢失精度
|