zoukankan      html  css  js  c++  java
  • double类型数值计算出现误差的解决办法

    因为公司做的项目几乎都跟金钱、货币有关,所以对数字精确度有相当高的要求,而在开发和维护的时候自然经常会涉及到数值的计算。

    但是在测试人员测数值的时候数值跟客户提供的数据比对又总是有差异,基本都是±1块钱或者±0.01之类的;

    虽然知道这是在计算机计算的时候,其实这些数字是用二进制保存的,计算后转换成十进制后会出现误差,因为总会出现无限小数的情况。

    以前碰到这种问题,基本上都是乘以一个整数10000或者100000,加上0.00001或0.000005之后无条件舍去小数,再除以前面乘上的数值;

    这样问题确实是暂时解决了,可是总会有解决不了的时候,比如数字不规律时,并不能知道是在第几个小数出现误差,这样就会非常麻烦。

    经过百度和查询相关资料后总算知道解决办法了:

    如果你的项目中对数字精确度要求很高,那就请使用decimal类型保存数值;当然也适用于其他语言,像java里的BigDecimal。

    摘自MSDN:

    decimal 关键字表示 128 位数据类型。同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

    如果希望实数被视为 decimal 类型,请使用后缀 m 或 M,如果没有后缀 m,数字将被视为 double 类型,从而导致编译器错误。

    如果项目对执行效率有更高的要求,那就使用double,因为double效率更高。

    code测试:

    结语:

    虽然用decimal能解决像截图例子的问题,但是或许不能解决掉所有数字计算的误差问题,这毕竟是计算机底层的事情,

    二进制转换过程中总有可能出现误差,避免不了,只能使用decimal尽量减少这种误差的出现。后续如果再碰到了只能再看情况而定了~!

  • 相关阅读:
    ubuntu 上安装ssh
    应用架构设计原则、模式摘录
    经典算法摘录
    CSS3选择器笔记
    微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)
    C#获取gif帧数
    C#根据byte前两位获取图片扩展名
    使用Amazon AWS SNS 发送 SMS 消息 .net
    MyCAT全局序列号-数据库方式
    MyCAT入门实践
  • 原文地址:https://www.cnblogs.com/EleMMent/p/7577900.html
Copyright © 2011-2022 走看看