java中,数值型Double运算出错问题

在java中(在python,js其他语言中也存在),某些double型数值运算会出错,例如0.1+0.2或者0.1*3会得到结果0.30000000000000004,网上有人提出解决办法如下:

Floati=3*0.1;

System.out.println(i);

但是对于0.9*1这种运算又会出现问题,用上述办法解决不了,所以,最好采用保留精度的方法,即设定保留小数点位数,下面保留小数点位数的工具类:

public static double round(double value, int scale) {

		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}

		BigDecimal b = new BigDecimal(Double.toString(value));
		BigDecimal one = new BigDecimal("1");

		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 12:18:58

java中,数值型Double运算出错问题的相关文章

JAVA中数值在计算机中的表示方式

很多刚学习JAVA的童鞋不明白为什么int型有时候强转为byte时会变为负数. 这是因为不明白JAVA中数值的表示机制. JAVA中规定用二进制补码的方式表示一个负数. 有了上面的概念之后我们就知道为什么高精度转换低精度类型时有时会变成负数. 比如 int 232转为byte时值 变为 -24 转换过程如下: 232在计算机中存储如下: 00000000 00000000 00000000 11101000 转为byte后舍去高位存储如下: 11101000 这个值最高位为1:因此他是一个负数,

精确计算java中float和double的精度

[本文相关的代码放在github上,地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式是遵循IEEE 754标准的.尽管数学意义上的小数是连续的,但double仅仅能表示其中的一些离散点,把这些离散点组成的集合记为S,S的大小还是有限的.如果要保存的小数P刚好在集合S内,那么double类型就能精确的表示P:否则double类型只能从集合S中找一个与P最近的离散点P'代替P. 以上表述对于float也成立.IE

Java中String转换Double类型 Java小数点后留两位

Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.toString()); 太祖元年 Java小数点后留两位 double num1 =11; double num1 =21; String num1 =""; DecimalFormat df = new DecimalFormat(".00");num3 = df.fo

Java中的浮点型(Double&amp;Float)计算问题

在刚刚做完的一个项目中,遇到了double型计算不精确的问题.到网上查找后,问题得到解决.经验共享,在这里总结一下. Java中的浮点数类型float和double不能够进行精确运算.这个问题有时候非常严重.比如,经过double型直接计算,1.4×1.5有时会得出2.0999999999999996的结果,但实际上,应该得到2.10.而且,类似的情况并不仅限于乘法计算. 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有.所以,在商业计算中我们要用:java.math.Big

Java中整型的缓存机制

译文出处: 张洪亮   原文出处:Java Papers 本文将介绍Java中Integer的缓存相关知识.这是在Java 5中引入的一个有助于节省内存.提高性能的功能.首先看一个使用Integer的示例代码,从中学习其缓存行为.接着我们将为什么这么实现以及他到底是如何实现的.你能猜出下面的Java程序的输出结果吗.如果你的结果和真正结果不一样,那么你就要好好看看本文了. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 pa

Java中float和double转换的问题

为什么double转float不会出现数据误差,而float转double却误差如此之大?   double d = 3.14; float f = (float)d; System.out.println(f); 输出结果是:3.14; float f = 127.1f; double d = f; System.out.println(d); 输出结果是:127.0999984741211 为什么结果会是这样呢? 如何避免这样的问题发生,让float转double能得到实际的数据? 解决办法

Java中i = i++的运算结果

在C/C++中,i = i++的运算结果是不确定的,但是在Java中,结果是确定的. int i = 5; i = i++; System.out.println(i); 输出结果为:5   int i = 5; i = ++i; System.out.println(i); 输出结果为:6   使用javap反汇编后,汇编代码如下: 0: iconst_5 //常量5 1: istore_1 //赋值 将常量5赋值给i 2: iload_1 //读取 3: iinc 1, 1 //自加1 6:

Java 中 long 和 double 的原子性?

JVM中对long的操作是不是原子操作? 为什么对long的操作不是原子的? 在硬件,操作系统,JVM都是64位的情况下呢? java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗? JVM中对long的操作是不是原子操作? 首先,通过一段程序对long的原子性进行判断.测试程序如下: public class LongAtomTest implements Runnable {     p

JAVA中数值的表示

1.Java中用补码形式表示 2.第一位正负位,1表示负,0表示正. 3.原码:一个数的二进制表示.                  3的原码00000011   -3的 原码 10000011 4.反码:负数原码按位取反(符号位不变).正数原码本身.                 3的反码00000011   -3的反码11111100 5.补码:正数是原码本身.负数反码加1.                  3的补码是00000011  -3的补码是11111101 ---------