推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
wslsq

请教一下 js 精度的问题

  •  
  •   wslsq · Nov 24, 2017 · 4383 views
    This topic created in 3275 days ago, the information mentioned may be changed or developed.

    最近在做一个前端计算器

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

    然而

    4246.77 * 100 = 4336.820000000001

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

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

    @fundon 谢谢,伸手了
    @Mutoo 谢谢,1)是写错了。学习了~
    mooncakejs
    mooncakejs
    Nov 24, 2017
    14
    说的好像别的语言没这个问题一样。
    wslsq
    wslsq
    OP
    Nov 24, 2017
    15
    @mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。
    谢谢大家 不一一回复了
    mooncakejs
    mooncakejs
    Nov 24, 2017
    16
    @wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。
    alen
    alen
    Nov 24, 2017
    17
    <img alt="" src=" ">
    hasbug
    hasbug
    Nov 24, 2017
    18
    网上找别人的轮子来用。。我都这么解决,给力不
    lybtongji
    lybtongji
    Nov 24, 2017
    19
    Firefox 显示正常
    Elven
    Elven
    Nov 24, 2017 via iPhone
    20
    用现成的库呀,比如 math.js ,bn.js 什么的
    moe3000
    moe3000
    Nov 24, 2017
    21
    toFixed 或者别人写的运算库
    wslsq
    wslsq
    OP
    Nov 24, 2017
    22
    @moe3000
    @Elven
    @lybtongji
    @hasbug
    谢谢大家 不一一回复了
    rover5056
    rover5056
    Nov 24, 2017
    24
    (*1000 +0.001)/1000
    自己想的办法 有点妖但是很好用
    rover5056
    rover5056
    Nov 24, 2017
    25
    再 FIX 一下就好了
    yuriko
    yuriko
    Nov 24, 2017❤️1
    26
    大多数语言都会有的问题,本质就是浮点数小数部分转成二进制会无限循环,再转换回来的时候丢失精度
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4346 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 08:58 · PVG 16:58 · LAX 00:58 · JFK 03:58
    ♥ Do have faith in what you're doing.