请教一下 js 精度的问题

2017-11-24 09:59:49 +08:00
 wslsq

最近在做一个前端计算器

关于 js 精度,网上教程大部分都是把小数处理成整数

然而

4246.77 * 100 = 4336.820000000001

请问一下大家一般怎么处理

3256 次点击
所在节点    JavaScript
26 条回复
chairuosen
2017-11-24 10:06:46 +08:00
把字符串里的点删了直接转 Number,然后通过点右边的长度判断倍数?
domty
2017-11-24 10:07:17 +08:00
看你保留几位小数了呗
比如保留两位小数就 乘 100 取整再除 100
domty
2017-11-24 10:07:56 +08:00
@domty #2
当然这种数不能太大,要考虑溢出问题
wslsq
2017-11-24 10:08:59 +08:00
@domty #2 我现在就是乘 100 的过程中出问题了,真让人头大
minyress
2017-11-24 10:09:09 +08:00
(123.123456).toFixed(3)
Mutoo
2017-11-24 10:09:32 +08:00
1) 4246.77 * 100 = 424677.00000000006
2) 小数处理成整数指的是 4246.77 表示成 424677 * 10^-2 而不是去计算 4246.77 * 100 因为前者本身就无法用 ISO754 浮点数精确表示。
3) 此类问题应该使用高精度算法解决
fundon
2017-11-24 10:09:51 +08:00
hubert3
2017-11-24 10:10:59 +08:00
chrome 显示 4246.77 * 100 = 424677.00000000006
yangehappy
2017-11-24 10:13:35 +08:00
说一下场景吧
wslsq
2017-11-24 10:14:35 +08:00
@hubert3 #8
疏忽,写错,的确是 424677.00000000006
autoxbc
2017-11-24 10:15:06 +08:00
math.js ,不要自己硬写
gyteng
2017-11-24 10:16:55 +08:00
注意 toFixed 也是有坑的
wslsq
2017-11-24 10:17:45 +08:00
@yangehappy 一个电脑配件计算器,cpu 内存什么的

@fundon 谢谢,伸手了
@Mutoo 谢谢,1)是写错了。学习了~
mooncakejs
2017-11-24 10:22:58 +08:00
说的好像别的语言没这个问题一样。
wslsq
2017-11-24 10:24:04 +08:00
@mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。
谢谢大家 不一一回复了
mooncakejs
2017-11-24 10:30:51 +08:00
@wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。
alen
2017-11-24 10:33:30 +08:00
<img alt="" src=" ">
hasbug
2017-11-24 10:34:51 +08:00
网上找别人的轮子来用。。我都这么解决,给力不
lybtongji
2017-11-24 10:38:47 +08:00
Firefox 显示正常
Elven
2017-11-24 10:50:34 +08:00
用现成的库呀,比如 math.js ,bn.js 什么的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/409114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX