Java加减导致的类型问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java加减导致的类型问题相关的知识,希望对你有一定的参考价值。

大家好,我写了个加减的程序,可是程序结果是 5.439999999999998,而不是5.44,请问这是为什么呢
package newProject;

public class CashRegister

public CashRegister()

purchase = 0;

payment = 0;



public void recordPurchase(double amount)

double newTotal = purchase + amount;

purchase = newTotal;



public void enterPayment(double amount)

payment = amount;



public double giveChange()

double change = payment - purchase;

payment = 0;

purchase = 0;

return change;



private double purchase;

private double payment;

;
---------------------------
package newProject;

public class CashRegisterTester

public static void main(String[] args)

// TODO Auto-generated method stub

CashRegister cr = new CashRegister();

cr.recordPurchase(10);

cr.recordPurchase(34.56);

cr.enterPayment(50);

System.out.println(cr.giveChange());



参考技术A 你设定的是double型的,需要两位的,就得进行format操作。
下面的方法供参考:
public static String giveChange()

double change = payment - purchase;

DecimalFormat df = new DecimalFormat("0.00");
String str = df.format(change);

payment = 0;
purchase = 0;

return str;
参考技术B

double change = payment(50.0) - purchase(34.56);

最后的运算是这样的,用50.0减34.56;两个数的精度不一样,会丢失数据!

一般都不用这样的方法做相减啊

 /**
     * 两个Double数相减
     * @param v1
     * @param v2
     * @return Double
     */
    public static Double sub(Double v1,Double v2)
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.subtract(b2).doubleValue();
    

参考技术C 主方法里写上:DecimalFormat df = new DecimalFormat("#.00");

System.out.println(df.format(cr.giveChange()));

注意引入:decimalFormat,类

java加减的二进制实现

  Java中整数基本类型有byte,short,int,long,大小分别为1、2、4、8个字节,一个字节大小为8位,也就是8个二进制码(0/1)组成。

  计算机中二进制码分为原码,反码,补码。在计算机中正数以原码存储,负数以补码存储。

  原码是在机器中表示的形式,首位1代表负数,0代表正数。比如 以byte类型为例, 0000 0001代表正数1,1111 1111 表示-1。 正数的原码,反码,补码相同,负数的反码为原码除了符号位,其他位取反。补码为反码加1。比如-3原码为1000 0011,反码就为1111 1100,存在计算机中的数就是1111 1101。补码得原码跟原码得补码相同。

  注意:计算机中1000 0000 代表-128。

  在java中如果两个-128相加,不考虑进位的情况下,结果为 1 0000 0000,因为byte类型,所以1舍弃,最后结果为0。

  同理Integer.MAX_VALUE+Integer.MAX_VALUE结果为-2。

以上是关于Java加减导致的类型问题的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中哪些基本数据类型支持加减乘除四则运算

java中,当要处理的整数太大,超出了long的范围,应该用啥基本类型去处理,实现对这个数的加减法运算

Java对String类型的时间进行加减操作

Java BigDecimal类型的 加减乘除运算及扩展

BigDecimal类型数据的加减乘除运算

java Long怎么进行加减?