Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用所有小数点设置双精度值,并且只在小数点后获得2位数字_Java_Hibernate_Decimal - Fatal编程技术网

Java使用所有小数点设置双精度值,并且只在小数点后获得2位数字

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

在java中,我对存储和获取双重值感到困惑。 目前,我正在创建一个软件,其中包括一些会计部分,我想存储计算值,就像计算的202.234212312一样,而在显示中,我想在小数点后2位显示为202.23。 在计算中,我想用2,4或6位数进行计算

为此,我有两个选择

  • 存储计算的值,在金额字段的getter方法中,我可以像这样格式化它

    private Double amount;
    public Double getAmount() {
        DecimalFormat df2 = new DecimalFormat(".##");
        return Double.valueOf(df2.format(amount));
    }
    
  • 但这个方法的问题是,在我得到数量的时候,它会得到格式化的数字。我无法获取实际存储量

  • 我可以为get和set使用两个单独的字段

    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的代码