java中double自减问题(java double相减)

  • 1、java 小问题 double 做减法溢出
  • 2、关于JAVA double类型相减的问题
  • 3、java double类型变量,相加或相减后面小数为什么会不一样呢?
  • 4、java中double减去取整的double为何会在0.00000000004左右徘徊,如1.2-(int)1.2 = 0.19999996,求大神解释
  • 5、java int double 加减法 基本类型运算问题

用BigDecimal计算

import java.math.BigDecimal;

import java.math.MathContext;

public class $ {

    public static void main(String[] args) {

        // 0.1*0.1+0.2*0.2+(-0.3)*0.3

        // 0.1*0.1+0.2*0.2-0.3*0.3

        BigDecimal a = new BigDecimal(0.1);

        a = a.multiply(a, MathContext.DECIMAL32);

        BigDecimal b = new BigDecimal(0.2);

        b = b.multiply(b, MathContext.DECIMAL32);

        BigDecimal c = new BigDecimal(0.3);

        c = c.multiply(c, MathContext.DECIMAL32);

        a = a.add(b, MathContext.DECIMAL32);

        a = a.subtract(c, MathContext.DECIMAL32);

        

        System.out.println(a.doubleValue());

    }

}

-0.04

可以相减 你的写法有错

输出函数的原型是print(String) 也就是括号里面的是String类型

多个string连接的时候用就 ” + ” 连接 你这里出现了 ” – ” 号 这是不允许的(double类型默认会调用toString()将数据转换成string)

当你用:System.out.println(“两个数的差是:”+a3-a4);减号被认为是错误的…

正确的写法应该是:System.out.println(“两个数的差是:”+(a3-a4));

至于你说 加 可以 只怕结果不是你想要的吧

乘除是因为运算符的优先级问题可以

建议你去看一些相关的基础吧

该问题主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示1/10。就像我们平时使用的十进制中无法精确的表示1/3是一样的道理,如果需要在数值计算中不含有任何误差,要使用BigDecimal类进行编程。

具体的代码如下

//两个Double数值相加

public static Double add (Double value01,Double value02){

BigDecimal b1=new BigDecimal(value01.toString());

BigDecimal b2=new BigDecimal(value02.toString());

return b1.add(b2).doubleValue();

}

//两个Double数值相减

public static Double sub (Double value01,Double value02){

BigDecimal b1=new BigDecimal(value01.toString());

BigDecimal b2=new BigDecimal(value02.toString());

return b1.subtract(b2).doubleValue();

}

假如除数和被除数都是int型,那么得到的数也就是整数 1。

然后你将1赋值给double,他会自动转换类型,变成double 1.0(转换有一定规则,你查下就知道)。所有输出值为1.0。

如果你想让他输出为1.5,你可以改变除数和被除数的类型(改变其中一个也可以,跟之前一样的知识点)

1.-2.8421709430404007E-14表示-2.8421709430404007乘以10的-14次方,计算机能准确表示十进制的整数,但不能准确表示十进制小数。System.out.println(150.0+0+183.28-0-183.28-150.0);150.0+0+183.28-0-183.28-150.0的结果为0.00000000000…,只不过你的输出结果为double型,精度比较高,没有超出打印函数(println之类的)的默认精度而已。

2.System.out.println(((150.00)+0.00+(183.28))-(0.00+(183.28)+(150.00)));中将((150.00)+0.00+(183.28))作为个运算单元,二个括号内的运算的结果肯定一样,与精度无关。结果当然为0。

3.用System.out.println((long)(150.0+0+183.28-0-183.28-150.0));(150.0+0+183.28-0-183.28-150.0)的结果为0.00000000…,转换成long,舍弃小数位,结果自然为0;

4.System.out.println(150.0F+0+183.28F-0-183.28F-150.0F); 运算结果为float型,超出打印函数(println之类的)的默认精度,截取下来为0。

不知道解释的你满意不?

原创文章,作者:VNFP2,如若转载,请注明出处:https://www.506064.com/n/127008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VNFP2的头像VNFP2
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相关推荐

发表回复

登录后才能评论