刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数。

  随手就改了个Double ,然后,跑下,没啥问题,直接上线了

  然后,就fuck 了

  加出一大堆的小数,大概是这样的

package com.venn.demo;

public class DoublePlus {

    public static void main(String[] args) {
double d1 = 0.01;
double d2 = 0.01; for (int i=0; i< 10; i++){
d2 += d1;
System.out.println(d2);
}
}
}

我以为的输出是这样的:

0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11

实际是这样的:

0.02
0.03
0.04
0.05
0.060000000000000005
0.07
0.08
0.09
0.09999999999999999
0.10999999999999999

一脸懵逼的看完一篇博客,似懂非懂的:程序员必知之浮点数运算原理详解

结论就是:

   很多十进制小数在转换成二进制时,并不能精确表示,只能是近似值。

解决办法就是使用BIgDecimal

public static void bigDecimalDemo(){

        BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.01"); for (int i=0; i< 10; i++){
b2 = b2.add(b1);
System.out.println(b2);
} }

输出如下:

0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11

Java 浮点数相加的更多相关文章

  1. js,java,浮点数运算错误及应对方法

    js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...

  2. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  3. Java 浮点数精度丢失

    Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...

  4. js浮点数相加、减、乘、除精确计算

    js 浮点数计算时 ,无缘无辜 后边冒出一堆 小数点………… 貌似js本身的问题,类型不定?????? 只能自己写函数处理..  http://blog.csdn.net/w4bobo/article ...

  5. JAVA浮点数计算精度损失底层原理与解决方案

    浮点数会有精度损失这个在上大学的时候就已经被告知,但是至今完全没有想明白其中的原由,老师讲的时候也是一笔带过的,自己也没有好好琢磨.终于在工作的时候碰到了,于是google了一番. 问题: 对两个do ...

  6. Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案

    一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...

  7. java浮点数剖析

    定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数.计算机系统采纳了所谓的浮点数表达方式.这种表达方式利用科学计数法来表达 ...

  8. java大数相加

    import java.math.BigInteger; import java.util.Scanner; public class Bignum{    public static void ma ...

  9. Java大数相加-hdu1047

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1047 题目描述: 题意有点绕,但是仔细的读了后就发现是处理大数相加的问题.注意:输入数据有多组,每组输 ...

随机推荐

  1. Python日志模块logging&JSON

    日志模块的用法 json部分 先开一段测试代码:注意  str可以直接处理字典   eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...

  2. DataBaseDaoAbstract

    import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.PreparedStatement; imp ...

  3. C# 调用Tesseract实现OCR

    介绍 Tesseract是一个基于Apache2.0协议开源的跨平台ocr引擎,支持多种语言的识别,在Windows和Linux上都有良好的支持. 创建工程 创建一个C#的控制台工程 添加System ...

  4. postgresql数据库3种程序(rule,trigger ,FUNCTION )

    1. CREATE [ OR REPLACE ] RULE name AS ON event TO table_name [ WHERE condition ] DO [ ALSO | INSTEAD ...

  5. Servlet-知识点

    2018年10月05日 16:52:56 yigg 阅读数:38   1.JavaWeb开发的目录结构 https://blog.csdn.net/u012661010/article/details ...

  6. 第三方jar上传到Maven私服(Nexus)

    mvn deploy:deploy-file -DgroupId=taobao-sdk -DartifactId=taobao-sdk-java -Dversion=1.0 -Dpackaging=j ...

  7. HTML5 元素文字超出部分显示省略号(支持多行),兼容几乎所有常用浏览器

    1,公共样式,在公共的 CSS 文件中加入以下内容  /* 超出部分显示省略号,支持多行 */ .text-ells:before { content: ''; float: left; width: ...

  8. com.mysql.jdbc.Connection.isValid(I)Z

    spring boot项目 运行提示这个错误的时候 只需要配置

  9. EntityFrameworkCore DBFirst

    需要引用如下nuget包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityF ...

  10. python学习Day1 计算机原理编程思维

    一.学习思想:3W+1H   学什么(what).为什么学(why).用在哪里(where).怎么用(how) 学习编程语言重在代码量.代码量.代码量! 二.计算机五大组成部分,三大核心: 五大组成部 ...