收藏
回答

小程序四舍五入算法有问题,小数点后两位相乘乘不尽

框架类型 问题类型 操作系统 工具版本
小程序 Bug Windows 1.02.1812271

208.5*5.85=*.4999999999



回答关注问题邀请回答
收藏

12 个回答

  • 连胜
    连胜
    2019-01-29

    浮点数的坑,不是小程序的产物,这个锅不是微信的,是JS的坑!在做PC端和普通H5时,照样会有这问题。

    在小程序内,用到浮点数的场景也不少,最多的,应该是商品购买,单价0.9、9.9、19.9等,再乘于奇数,大概率出现楼主说的bug


    建议自己在JS中四舍五入一下~


    如果调用小程序的支付API,用户反馈一直支付失败,很可能是这个bug引起。支付的API会校验前端传入的价格,与服务端生成订单时的价格是否一致,不一致的话,肯定支付失败。

    2019-01-29
    有用 18
    回复 1
    • 2019-01-29

      我这里有一种计算方式能解决正在全面测试

      for(let i=80;i<160;i++){

           for (let j = 19900; j <= 20000; j++){

             if(j%5==0){

               let b = i*5


               let a = Math.round((j/ 100 * b).toFixed(2)) / 100  -----》这里是重点

               // console.log(a)

               // console.log(b)

               let data = {

                 consumePrices: a,

                 price: b / 100,

                 amount: j/ 100,

                 listPirce: b / 100 + 2

               }

               

             }

           }

         }


      2019-01-29
      回复
  • 初衷
    初衷
    2019-01-29

    这不是小程序的问题,包括在web端,js的浮点小数相加都会存在这种陷阱。推荐你看看这个   js浮点数陷阱

    2019-01-29
    有用 2
    回复
  • 小王子
    小王子
    2019-01-31

    parseFloat((208.5*5.85).toFixed(10))

    原理:https://blog.csdn.net/qq_38209578/article/details/86084586

    2019-01-31
    有用 1
    回复
  • 天泽圣司
    天泽圣司
    2019-02-01

    不光JS一门语言,凡是采用IEEE 754标准定义表示数字的编程语言都有这个问题,只是其他语言有内部处理机制。深层次原因可以参考http://0.30000000000000004.com/

    2019-02-01
    有用
    回复
  • 💮店長推薦.
    💮店長推薦.
    2019-02-01

    这个循环我都惊了

    2019-02-01
    有用
    回复 1
    • 2019-02-01

      业务代码测试·····

      2019-02-01
      回复
  • 你的沙僧
    你的沙僧
    2019-01-31

    这个问题是底层锅

    绝大部分语言都有此类问题,有些语言有专门处理的类型或者类

    可以和微信学 把单位从元改为分,小数一律不保留

    解决问题就方便了

    2019-01-31
    有用
    回复 1
    • 2019-02-01

      我们就是要保留两位小数大哥

      2019-02-01
      回复
  • 鹏
    2019-01-31

    就是浮点数的保存你可以去看下数据类型的结构,这是没办法避免的,但是涉及到金钱的情况下,需要准确值,不允许有误差.所以大部分情况下涉及金额的数值都用long型来保存,然后再显示的时候再做小数点的添加!

    2019-01-31
    有用
    回复
  • 陈词,
    陈词,
    2019-01-31

    就像0.1+0.2!=0.3一样的问题,是js的浮点数精确度问题。

    2019-01-31
    有用
    回复
  • 黎😄
    黎😄
    2019-01-30

    额,之前我做支付的时候都是每次算完都自己四舍五入一下的~~事实上,浮点数精确度问题,好多种语言都会有这问题的喔

    2019-01-30
    有用
    回复
  • 2019-01-30

    是二进制存储计算导致的吧

    2019-01-30
    有用
    回复

正在加载...

登录 后发表内容