误差-Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。

问题描述

Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。

下图讲解,我懂。

但是,在做题的时候.............

才发现,我也只能确定0.1不能被精确显示,具体该如何解这样的题呢?
其实我进一步思考了。我以为就看尾数是不是5。比如0.5、0.05。因为2的-x次方的尾数都是5。是5就能精确显示,不是就不能。但是后来发现.................
计算误差">
说明不能只靠最终结果来判断...............那该怎么判断啊?

问题补充:我知道有BigDecimal这个类,我只可以用这个类避免精度问题。
但是我的问题就是如果做笔试题的时候,遇到这种挫科的问题(如第二幅图所示,刚刚图错了,不好意思哈~~呵呵),该如何找到正确的选项?

解决方案

对于float 和 double, 建议用BigDecimal进行运算。


import java.math.BigDecimal;

public class DoubleTest {
    public static void main(String[] args) {
        double d = 3.0d;
        double f = 2.1d;
        BigDecimal bd1 = new BigDecimal(Double.toString(d));
        BigDecimal bd2 = new BigDecimal(Double.toString(f));
        System.out.println("result=" + bd1.subtract(bd2));
    }
}

解决方案二:

看看这篇文章就可以了。还是用BigDecimal类吧,我项目里面用的就是这个类,http://blog.csdn.net/xionglangs/article/details/50932565。

解决方案三:

有两个误差,一个是浮点本身的误差,一个是进制转换误差,能精确表示的小数必须可以分解为1/2^n的和,比如0.5 0.25 0.125 0.0625...,不是带5结尾。
另外还有浮点本身的误差,比如说10^10000+10^-10000相加,因为两者的数量级差异太大,所以第二个数会被舍去,如果计算10^10000+10^-10000-10^10000,那么结果可能是0,而不是10^-10000

时间: 2024-11-05 12:08:52

误差-Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。的相关文章

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错.  首先贴一个使用的代码: /** * 将double类型数据转为字符串(如将18.4转为1840,如果需要1840.0,把int强转去掉即可) * @par

java中double类型运算结果异常的解决方法_java

问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100); 输出: 39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001 解决方法: J

Java的double类型探索.

一.double类型的存储表示 Java的浮点类型表示完全按照IEEE754标准(Standards of IEEE 754 floating point numbers),有兴趣可以上IEEE标准网站(www.ieee.org)查阅.该标准的内容基本上描述了浮点类型的存储格式(Storage Layout),下面我从中总结几段,来概括该标准,详细信息请查阅标准原文. 1.什么是浮点数. 计算机上表达实数有两中方法:定点表示(fixed-point)和浮点表示(floating-point).定

java中double类型的值如何实现科学计数法

问题描述 java中double类型的值如何实现科学计数法 java中,一个double类型的数值,如何在显示的时候是科学计数法 解决方案 它达到一定的值,就会显示成科学计数格式,当然你可以自己这个格式化方法任意转 解决方案二: 小数位数多了自动科学计数法表示的吧.

java中float,double利用BigDecimal运算

一.发现问题 float.double两种基本类型在运算的时候容易引起精度丢失.以float为例说明. public static void main(String[] args) {    float x = 1.0f;    float y = 0.8f;    float z = x - y;    System.out.println(z); } 结果是0.19999999 二.解决办法 利用java.math中的BigDecimal类进行操作 public static void ma

Java中涉及byte、short和char类型的运算操作

运算 Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int类型的结果.如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型.例如,下面的代码会导致编译失败: class BadArithmetic {      static byte addOneAndOne() {        byte a = 1;        by

java-我懂!是进制的问题导致Java的double型运算结果显示有精度问题,但是!!

问题描述 我懂!是进制的问题导致Java的double型运算结果显示有精度问题,但是!! 20C 但是,做笔试的时候,遇到这样一道题:下列表达式中,可以得到精确结果的是哪些?A.double d1 = 3.0-2.6:B.double d2 = 2.5*1.5:C.double d3 = 3.0-2.5:D.double d4 = 1.0-0.6:E.double d5 = 4.015*100:F.double d6 = 4.015*10: 实在是遇到这样的挫科的题目,我临场时该怎么解噜?!总不

Java中,double类型的两个小数相减,值不正确

问题描述 Java中,double类型的两个小数相减,值不正确 double num1 = 0.03; double num2 = 0.02; double num; num = num1 - num2; 此时得到的num!= 0.01,而是等于0.0099....998:请问这是为什么啊?这是由于double类型的精度造成的嘛?谢谢. 解决方案 浮点数存储肯定有精度误差,特别是小数点后面,可以用BigDecemal这个类做

我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static void main(String[] args) { int a=5; System.out.println("value is :"+((a<5)?10.9:9)); } } A.编译错误     B.10.9           C.9           D.以上答案都不对 我不假