返回没有尾随零的双精度类型

Posted

技术标签:

【中文标题】返回没有尾随零的双精度类型【英文标题】:Return double type without trialing zero 【发布时间】:2020-08-18 18:35:32 【问题描述】:

我正在尝试返回双精度/浮点值,但没有添加尾随零。

我使用过 NumberFormat、DecimalFormat 但是一旦我将 double 或 float 转换为结果,它会添加尾随零(这是预期的)。我想知道是否有办法防止这种情况发生。

        private Double format (double input)         

        NumberFormat nf = NumberFormat.getIntegerInstance(Locale.US);           
        Double result = null; 
        BigDecimal bd = new BigDecimal(input); 
        
        if(bd.intValue() > 99)
        //(don't want to add trailing zeros here)
                return (double)bd.intValue();
        else
            nf.setMinimumFractionDigits(1);
            nf.setMaximumFractionDigits(1);
            result = Double.parseDouble(nf.format(bd.doubleValue()));
        
        return result; 
   

附:我不想在这里返回字符串值。

【问题讨论】:

【参考方案1】:

“尾随零”仅与浮点数或双精度数的字符串表示有关。

由于尾​​随零不会影响数字的值,因此存储在 float 或 double 中的数据保持不变。例如,“3.4”和“3.4000”是同一个数字,它只是这个数字的两种不同表示,比如“3.4 e+00”仍然是显示相同数字的另一种方式。

【讨论】:

使用 String.Format() 您可以轻松更改该数字的打印方式。【参考方案2】:

您可以使用 stripTrailingZeros,它是 Java 中的内置方法,在删除尾随零后返回 BigDecimal

Double.valueOf(bd.stripTrailingZeros().toPlainString());

【讨论】:

【参考方案3】:

如果您将int 值分配给double 变量,默认情况下它将始终以尾随零表示。你有两个选择:

    将其格式化为您想要的任何字符串。

    将其转换为BigDecimal,然后使用BigDecimal#stripTrailingZeros 得到不带尾随零的BigDecimal

    import java.math.BigDecimal;
    
    public class Main 
        public static void main(String[] args) 
            double x = 5;
            System.out.println(x);
    
            BigDecimal y = BigDecimal.valueOf(x).stripTrailingZeros();
            System.out.println(y);
        
    
    

输出:

5.0
5

【讨论】:

以上是关于返回没有尾随零的双精度类型的主要内容,如果未能解决你的问题,请参考以下文章

格式化没有尾随零的浮点数

显示小数而没有尾随零的最佳方法

Swift - 从 Double 中删除尾随零

__saturatef() 内在函数没有等效的双精度

Pyspark 在返回 0 的双精度数上转换整数

格式化double,printf中至少有一个小数