有没有办法将格式化的 BigDecimal 数字分配给 BigDecimal?

Posted

技术标签:

【中文标题】有没有办法将格式化的 BigDecimal 数字分配给 BigDecimal?【英文标题】:Is there a way to assign a formatted BigDecimal number to a BigDecimal? 【发布时间】:2019-06-06 06:37:39 【问题描述】:

我有一段代码有两个 BigDecimal 变量。两个变量都被发送到方法格式(工作正常),然后打印。变量“d”被发送到格式方法,然后直接打印而不分配它(因为方法格式返回一个字符串)。 问题出现在变量 a 中,我在其中分配格式化值(这是一个字符串),转换为 bigDecimal,然后存储在变量 a 中。当我打印 a 的值时格式被保留,但当我打印变量 d 时格式不存在。如何在不丢失格式的情况下将格式化值分配给 BigDecimal 变量?

public static void main(String[] args) 
    BigDecimal d = new BigDecimal("0.0005");
    BigDecimal a = new BigDecimal(format(d, 2));

    System.out.println(a); // 0.000500
    System.out.println(format(new BigDecimal("0.00001"), 3)); // 1.000E-5


private static String format(BigDecimal x, int scale) 
    NumberFormat formatter = new DecimalFormat("0.0E0");
    formatter.setRoundingMode(RoundingMode.HALF_UP);
    formatter.setMinimumFractionDigits(scale);
    return formatter.format(x);

【问题讨论】:

这里我要问你一个问题,你期望的与 BigDecimal "d" 相关的输出是什么?因为在阅读了您的问题后,您似乎已经格式化了 BigDecimal "a" 并且希望 BigDecimal "d" 具有相同的输出。 我想保持与“System.out.println(format(new BigDecimal("0.00001"), 3));”的输出相同的值(忽略值变化) 【参考方案1】:

数字(无论是哪种类型 - BigDecima、Float、Long)用于存储值(最准确的值)而不是它们的字符串表示形式。您不能将“格式化值”作为数字“存储”并期望它一直以这种方式表示。每次你想要格式化的值,你都必须格式化它。

这里

BigDecimal a = new BigDecimal(format(d, 2));

您只是使用一些格式化的数字(即字符串)创建新的 BigDecimal。该字符串被解析回数字,仅此而已。

您期望发生的事情类似于说您希望“字符串”在二进制系统中“按原样”存储 - 因为这就是数字的物理存储方式。不,它仍然是一堆 1 和 0。

【讨论】:

以上是关于有没有办法将格式化的 BigDecimal 数字分配给 BigDecimal?的主要内容,如果未能解决你的问题,请参考以下文章

将 BigDecimal 格式化为最多 2 个十进制数字的字符串,在小数部分删除 0

格式化存储为字符串的数字

BigDecimal 数字的格式

BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

Java连载80-数字类格式随机数BigDecimal

BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)