请教一下 js 精度的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
wslsq
V2EX    Javascript

请教一下 js 精度的问题

  •  
  •   wslsq 2017-11-24 09:59:49 +08:00 3600 次点击
    这是一个创建于 2890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一个前端计算器

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

    然而

    4246.77 * 100 = 4336.820000000001

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

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

    @fundon 谢谢,伸手了
    @Mutoo 谢谢,1)是写错了。学习了~
    mooncakejs
        14
    mooncakejs  
       2017-11-24 10:22:58 +08:00
    说的好像别的语言没这个问题一样。
    wslsq
        15
    wslsq  
    OP
       2017-11-24 10:24:04 +08:00
    @mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。
    谢谢大家 不一一回复了
    mooncakejs
        16
    mooncakejs  
       2017-11-24 10:30:51 +08:00
    @wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。
    alen
        17
    alen  
       2017-11-24 10:33:30 +08:00
    <img alt="" src=" ">
    hasbug
        18
    hasbug  
       2017-11-24 10:34:51 +08:00
    网上找别人的轮子来用。。我都这么解决,给力不
    lybtongji
        19
    lybtongji  
       2017-11-24 10:38:47 +08:00
    Firefox 显示正常
    Elven
        20
    Elven  
       2017-11-24 10:50:34 +08:00 via iPhone
    用现成的库呀,比如 math.js ,bn.js 什么的
    moe3000
        21
    moe3000  
       2017-11-24 10:51:07 +08:00
    toFixed 或者别人写的运算库
    wslsq
        22
    wslsq  
    OP
       2017-11-24 10:59:47 +08:00
    @moe3000
    @Elven
    @lybtongji
    @hasbug
    谢谢大家 不一一回复了
    rover5056
        24
    rover5056  
       2017-11-24 11:24:37 +08:00
    (*1000 +0.001)/1000
    自己想的办法 有点妖但是很好用
    rover5056
        25
    rover5056  
       2017-11-24 11:25:13 +08:00
    再 FIX 一下就好了
    yuriko
        26
    yuriko  
       2017-11-24 17:40:55 +08:00   1
    大多数语言都会有的问题,本质就是浮点数小数部分转成二进制会无限循环,再转换回来的时候丢失精度
    关于     帮助文档     自助推广系统     博客     API    FAQ     Solana     5203 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:31 PVG 15:31 LAX 00:31 JFK 03:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86