Java double 将超过 4 位小数转换为指数格式,并将相同的指数格式存储在 DB 中

问题描述 投票:0回答:1

我有一个实体类(帐户),其中我有以下属性

@Column(name = "balance", precision = 10, scale = 10, nullable = false)

Double balance;

然后在我的一项春季服务中,我正在执行两个(双)数字的减法,如下所示

Account account = accountRepository.findById(1);
Double result = 0.0;
Double amount = 9.99999999;
BigDecimal bdResult = subtract(account.getBalance, amount);
result = bdResult.setScale(8, RoundingMode.HALF_EVEN).doubleValue();
account.setBalance(result); //It sets the value in exponential format
accountRepository.saveAndFlush(account); //Also in the DB it store in exponential form

static BigDecimal substract(Double balance, Double amount) {
    BigDecimal bd1 = BigDecimal.valueOf(balance);
    BigDecimal bd2 = BigDecimal.valueOf(amount);
    BigDecimal result = bd1.setScale(8, RoundingMode.HALF_EVEN).subtract(bd2.setScale(8, 
    RoundingMode.HALF_EVEN));
    return new BigDecimal(result.toPlainString().trim());
}

这是实体(DB)属性,仅供参考,我正在使用 Oracle SQL

因此,当数据持久保存到数据库中时,该值将以指数形式存储。我希望该值以精确的格式存储,即以非指数形式存储。 例如考虑

double balance = 10.0 //account.getBalance();
double amount =  9.99999999;
//After calling AmountUtility.subtract(balance, amount) the result should be as follows
double result = 0.00000001

我想确保表中也保留相同的结果格式,因为我必须遵循 8 位小数精度。

我几天来一直在努力寻找解决方案,但仍然没有找到。如果有人可以在这里帮助我,我将非常感激。

java spring-boot double bigdecimal exponential
1个回答
0
投票

要从

amount
中减去
balance
,请写

balance -= amount;

如果您想以纯文本形式查看结果,精确到小数点后 8 位,请写下

System.out.printf("%.8f\n", balance);

但是根据您的数据库定义,您没有在数据库中存储字符串。它是一个 FLOAT,因此既不是也不是您所说的“指数格式”。它只是一个浮点值。


尽管如此,正如经常重复的那样,请勿使用浮点来表示货币值。

© www.soinside.com 2019 - 2024. All rights reserved.