Java使用所有小数点设置双精度值,并且只在小数点后获得2位数字
在java中,我对存储和获取双重值感到困惑。 目前,我正在创建一个软件,其中包括一些会计部分,我想存储计算值,就像计算的202.234212312一样,而在显示中,我想在小数点后2位显示为202.23。 在计算中,我想用2,4或6位数进行计算 为此,我有两个选择Java使用所有小数点设置双精度值,并且只在小数点后获得2位数字,java,hibernate,decimal,Java,Hibernate,Decimal,在java中,我对存储和获取双重值感到困惑。 目前,我正在创建一个软件,其中包括一些会计部分,我想存储计算值,就像计算的202.234212312一样,而在显示中,我想在小数点后2位显示为202.23。 在计算中,我想用2,4或6位数进行计算 为此,我有两个选择 存储计算的值,在金额字段的getter方法中,我可以像这样格式化它 private Double amount; public Double getAmount() { DecimalFormat df2 = new Decim
private Double amount;
public Double getAmount() {
DecimalFormat df2 = new DecimalFormat(".##");
return Double.valueOf(df2.format(amount));
}
private Double amount;
private Double amountFormatted;
public Double getAmount() {
return amount;
}
public Double getAmountFormatted() {
DecimalFormat df2 = new DecimalFormat(".##");
return Double.valueOf(df2.format(amountFormatted));
}
因此,请提供更好的存储和获取十进制值的方法,谢谢。如果我理解正确,您只需要为同一个值获取不同的格式,您可以有一个变量和两个get字段,如下所示:
private Double amount;
public Double getAmount() {
return amount;
}
public Double getAmountFormatted() {
DecimalFormat df2 = new DecimalFormat(".##");
return Double.valueOf(df2.format(amount));
}
如果我理解正确,您只需要为相同的值获取不同的格式,您只需要一个变量和两个get字段,如下所示:
private Double amount;
public Double getAmount() {
return amount;
}
public Double getAmountFormatted() {
DecimalFormat df2 = new DecimalFormat(".##");
return Double.valueOf(df2.format(amount));
}
首先,所有涉及金钱的计算都应该使用BigDecimal,而不是double。double不能精确表示0.1这样的数量 其次,如果您的
getAmountFormatted
仅用于输出目的,则不应返回Double,而应返回字符串
对两种方法使用相同的金额变量。首先,所有涉及货币的计算都应使用BigDecimal,而不是double。double不能精确表示0.1这样的数量 其次,如果您的
getAmountFormatted
仅用于输出目的,则不应返回Double,而应返回字符串
两种方法使用相同的amount变量。实体的工作不是提供用于显示的格式化数据:将格式化留给实际执行显示的代码。更重要的是,作为实体类的程序员,您的工作不是1)预测未来对格式化值的所有需求,2)不断更新实体类以提供您没有(不,不能)预测的新格式化值 因此,只需让
getAmount
方法返回原始的纯数据:
public class Entity {
private BigDecimal amount;
public BigDecimal getAmount(){
return amount;
}
//...
}
并从实体中删除getAmountFormatted
。当您想显示格式化为小数点后两位的金额时,只需使用getAmount()
获取原始金额并立即格式化即可:
Entity e = ...;
DecimalFormat df = new DecimalFormat(".##");
System.out.println("The amount is " + df.format(e.getAmount());
这里有一个小故事,说明了为什么我认为这是一条路要走
假设在您的实体中有第二笔金额,otherAmount
,该金额在创建实体时包含,因为有人认为将来可能需要它。并且假设,由于该字段当时没有计划使用,您不必费心创建一个getOtherAmountFormatted()
方法来提供一个两位十进制格式的otherAmount
现在,未来到来了。现在正在使用otherAmount
字段,您需要开始显示该字段,并将其与原始amount
一起保留两位小数。你知道你得加一行
System.out.println("The other amount is " + ...
输入显示金额的代码。唯一的问题是,你如何完成这一行。您是否将getOtherAmountFormatted()
方法添加到实体类中,然后写入:
System.out.println("The other amount is " + e.getOtherAmountFormatted()); // NO!!
或者您是否完全不接触实体类,只写:
System.out.println("The other amount is " + df.format(e.getOtherAmount()); // Yes!!
实体并不是最终需要格式化版本的otherAmount
的类,因此它不应该仅仅为了适应现在恰好需要格式化版本的otherAmount
的一些完全不同的代码位而进行更改。特别是当其他代码只需要获得未格式化的量(未修改的实体已经可以提供),然后为自己进行所需的格式化时
下一个场景:在未来,还需要打印这些金额字段,但现在需要小数点后三位。您是否打算在entity类中添加更多方法来提供金额的三个十进制版本(除了已经提供两个十进制版本的方法之外)?或者您是否完全不接触entity类,只在需要这三个十进制格式的值时写入:
DecimalFormat df3 = new DecimalFormat(".###");
// ...
System.out.println("The amount in 3 decimals is " + df3.format(e.getAmount());
System.out.println("The other amount in 3 decimals is " + df3.format(e.getOtherAmount());
实体的工作不是提供用于显示的格式化数据:将格式化留给实际执行显示的代码。更重要的是,作为实体类的程序员,您的工作不是1)预测未来对格式化值的所有需求,2)不断更新实体类以提供您没有(不,不能)预测的新格式化值 因此,只需让
getAmount
方法返回原始的纯数据:
public class Entity {
private BigDecimal amount;
public BigDecimal getAmount(){
return amount;
}
//...
}
并从实体中删除getAmountFormatted
。当您想显示格式化为小数点后两位的金额时,只需使用getAmount()
获取原始金额并立即格式化即可:
Entity e = ...;
DecimalFormat df = new DecimalFormat(".##");
System.out.println("The amount is " + df.format(e.getAmount());
这里有一个小故事,说明了为什么我认为这是一条路要走
假设在您的实体中有第二笔金额,otherAmount
,该金额在创建实体时包含,因为有人认为将来可能需要它。并且假设,由于该字段当时没有计划使用,您不必费心创建一个getOtherAmountFormatted()
方法来提供一个两位十进制格式的otherAmount
现在,未来到来了。现在正在使用otherAmount
字段,您需要开始显示该字段,并将其与原始amount
一起保留两位小数。你知道你得加一行
System.out.println("The other amount is " + ...
输入显示t的代码