首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java设置双精度值,小数点后仅取2位

Java设置双精度值,小数点后仅取2位
EN

Stack Overflow用户
提问于 2018-09-28 17:13:32
回答 3查看 1.3K关注 0票数 0

在java中,我对存储和获取双倍值感到困惑。目前我正在创建软件,其中包括一些会计部分,我想存储的计算值一样,因为他们是计算202.234234234212312,而在显示时,我想显示它为202.23在小数点后的2位数字。在计算中,我想要做2,4或6位数的计算。

为此,我有两个选择

  1. 存储计算出来的值,在amount字段的getter方法中,我可以这样格式化它。

私有双倍金额;公共双倍getAmount() { DecimalFormat df2 =新DecimalFormat(".##");return Double.valueOf(df2.format(GetAmount));}

但这种方法的问题是,它将得到格式化的数字,在我获得金额的所有时间。我不能得到实际的储存量。

  1. 我可以使用两个单独的字段来表示get和set。

私有Double amount;private Double amountFormatted;public Double getAmount() { return amount;} public Double getAmountFormatted() { DecimalFormat df2 = DecimalFormat(".##");return Double.valueOf(df2.format(amountFormatted));}

所以请提供更好的存储和获取十进制值的方法,谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-09-28 17:31:31

首先,所有涉及金钱的计算都应该在BigDecimal中完成,而不是重复。double不能精确地表示像0.1这样的量。

其次,如果getAmountFormatted仅用于输出,则不应返回双精度值,而应返回字符串。

对这两种方法使用相同的数量变量。

票数 2
EN

Stack Overflow用户

发布于 2018-09-28 17:30:04

如果我没理解错的话,你只是想为相同的值获取不同的格式,你可以只有一个变量和两个获取字段,如下所示:

代码语言:javascript
复制
private Double amount;

public Double getAmount() {
    return amount;
}

public Double getAmountFormatted() {
    DecimalFormat df2 = new DecimalFormat(".##");
    return Double.valueOf(df2.format(amount));
}
票数 0
EN

Stack Overflow用户

发布于 2018-09-28 20:05:39

提供格式化数据以供显示不是实体的工作:将格式化留给实际执行显示的代码。更重要的是,作为实体类的程序员,您的工作不是1)预测每个未来对格式值的需求,2)不断更新实体类以提供您没有(不,不能)预期的新的格式化值。

因此,只需让getAmount方法返回原始的未掺杂数据:

代码语言:javascript
复制
public class Entity {
    private BigDecimal amount;
    public BigDecimal getAmount(){ 
        return amount;
    }
    //...

}

并从实体中消除getAmountFormatted。当您想要显示格式为小数点后两位的金额时,只需使用getAmount()获取原始金额并当场格式化即可:

代码语言:javascript
复制
Entity e = ...;
DecimalFormat df = new DecimalFormat(".##");
System.out.println("The amount is " + df.format(e.getAmount());

这里有一个小故事,它说明了为什么我认为这是一条可行的道路。

假设您的实体中还有第二个数量,即otherAmount,这是在创建实体时包含的,因为有人认为将来可能需要它。假设,因为字段当时没有计划的用途,所以您不必创建一个getOtherAmountFormatted()方法来提供两个十进制格式的otherAmount版本。

现在,未来来了。现在正在使用otherAmount字段,您需要开始将其与原始amount一起显示为两位小数。你知道你必须添加这一行

代码语言:javascript
复制
System.out.println("The other amount is " + ...

到显示金额的代码中。唯一的问题是,你如何完成这一行。您是否将getOtherAmountFormatted()方法添加到您的实体类中,然后编写:

代码语言:javascript
复制
 System.out.println("The other amount is " + e.getOtherAmountFormatted());  // NO!!

或者,您是否完全不使用实体类的,而只是写下:

代码语言:javascript
复制
 System.out.println("The other amount is " + df.format(e.getOtherAmount()); // Yes!!

实体并不是最终需要格式化版本的otherAmount的类,因此它不应该仅仅为了适应现在需要格式化版本的otherAmount的一些完全不同的代码而进行更改。特别是当另一位代码只能获得未修改的实体已经提供的未格式化的数量,然后为自己进行所需的格式化时。

下一个场景:在未来,还会有另一个要求打印这些金额字段,但现在打印的是三位小数。您是否打算在entity类中添加更多的方法来提供三位小数版本的金额(除了已经提供两位小数版本的方法之外)?或者,您是否会在所有中都不接触实体类,而只是在需要这些三位十进制格式值的时候写入:

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52552023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档