本人前段时间做一个社区电商应用,发现了一个 天坑   ...................让我哭会 。 下面听听我的踩坑之路吧 ,电商肯定跟¥打交道了,计算少不了的。由于本人太菜 单纯的以为  float  double 可以直接参与加减乘除 感觉这种代码万无一失没去想这么多直接 float*int 。 之前简单测试没问题,项目上线后自己偶然才发现的(不知道公司测试干嘛的) ,当选择多件商品时 , 还是直接说现象吧 比如 在代码中    0.1 f  * A         A为int 型  当A = 1结果没错  但是 慢慢增大 到 A = 9  的时候  结果等于 0.9000000.(多少0忘了)...4 ,这就尴尬了  当时一脸蒙逼  后来百度查了一下说  浮点型精度不准什么的  , 反正我这个菜鸟不怎么动  , 但是人家有了解决方法这是重点.... 所以以后千万不要随便拿浮点型进行运算 ,尤其是涉及金额的。不说了 我把运算的工具类贴出来吧 ,趁老板还没发现 赶紧更新掉。

工具类如下:

/**
* @author Mr_Peng
* @created at 2017/6/9 10:13.
* @describe: java 精度运算
*/ public class ArithUtil {
private static final int DEF_DIV_SCALE=10; private ArithUtil(){}
public static double add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2).doubleValue(); } public static double sub(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.subtract(b2).doubleValue(); } public static double mul(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.multiply(b2).doubleValue(); } public static double div(double d1,double d2){ return div(d1,d2,DEF_DIV_SCALE); } public static double div(double d1,double d2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
} 证明:真实有效 ,运算结果100%准确 不会出现多余小数位数。

解决java float double 浮点型参与计算失精度的更多相关文章

  1. java中float/double浮点数的计算失精度问题(转)

    如果我们编译运行下面这个程序会看到什么? public class Test  {    public static void main(String args[]) {                ...

  2. float double 如何存储计算2 (这个写的也不错)

    目前java遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号. 我 ...

  3. Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  4. 关于c中 int, float, double转换中存在的精度损失问题

    先看一段代码实验: #include<limits> #include<iostream> using namespace std; int main() { unsigned ...

  5. JAVA float double数据类型保留2位小数点5种方法

    /** * Java 两个整数相除保留两位小数,将小数转化为百分数 * java中,当两个整数相除时,由于小数点以后的数字会被截断,运算结果将为整数,此时若希望得到运算结果为浮点数,必须将两整数其一或 ...

  6. java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】

    由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static vo ...

  7. java float double bigdecimal

    java 有 float,double,BigDecimal 三种,前两者会损失精度,最后一个是专门用于高精度计算的大数类型,但是会损失性能.如果用于金融场合且小数位并不多的时候,可以考虑 BigDe ...

  8. Java中浮点型数据Float和Double进行精确计算的问题

    Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失     ...

  9. 14、Java中用浮点型数据Float和Double进行精确计算时的精度问题

    一.浮点计算中发生精度丢失 大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个 ...

随机推荐

  1. 团体程序设计天梯赛-练习集-L1-036. A乘以B

    L1-036. A乘以B 看我没骗你吧 —— 这是一道你可以在10秒内完成的题:给定两个绝对值不超过100的整数A和B,输出A乘以B的值. 输入格式: 输入在第一行给出两个整数A和B(-100 < ...

  2. Java子类对于父类中static方法的继承

    今天看到了Java中子类继承父类的一个相关讨论,在网上综合了各家的观点,写下了一篇简短的总结. 问题如下,在父类中含有staic修饰的静态方法,那么子类在继承父类以后可不可以重写父类中的静态方法呢? ...

  3. S-HR二开基础

    检测是否某个类部署上去了:http://10.3.0.115:6888/easportal/tools/getclassurl.jsp?className=com.kingdee.eas.hr.ser ...

  4. html第四节课

    css CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/    此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合 ...

  5. 57.query phase

    主要知识点: query phase步骤 query phase如何提升性能     一.query phase步骤 一次query phase一般包括以下三个步骤     The query pha ...

  6. Codeforces 902D/901B - GCD of Polynomials

    传送门:http://codeforces.com/contest/902/problem/D 本题是一个数学问题——多项式整除. 对于两个整数a.b,求最大公约数gcd(a,b)的辗转相除法的函数如 ...

  7. orcale 日期显示格式化

    SQL> select * 2 from emp 3 where hiredate='1987-11-17'; where hiredate='1987-11-17' * 第 3 行出现错误: ...

  8. 修改电脑名称后,Oracle客户端连不上

    有以下几个步骤可以尝试,帮助大家缩小错误范围. 1  命令窗口使用sqlplus查看数据库服务是否正常,如下图,没有出现“连接到:”表示数据库服务不正常. 2  在任务管理器中查看数据库的监听是否已经 ...

  9. iOS UIToolBar的使用

    UIToolBar存在于UINavigationController导航栏控制器中.并且默认被隐藏. 当设置UIToolBar显示,或者存在UITabBarController且tabbar被隐藏的时 ...

  10. hadoop1.0.4升级到hadoop2.2 具体流程步骤

     hadoop1.x 升级到hadoop2.2 本文參考了博客:http://blog.csdn.net/ajax_jquery/article/details/27311671,对一些地方做了改动. ...