gpt4 book ai didi

Java NumberFormat 在 "UP"模式下舍入不正确

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:28 24 4
gpt4 key购买 nike

此测试失败:

@Test
fun testFormatRoundedUp() {
val formatter = NumberFormat.getCurrencyInstance()
formatter.maximumFractionDigits = 0
formatter.roundingMode = UP
formatter.currency = Currency.getInstance("USD")
val decimal = 1 / 100.toDouble()
assertThat(formatter.format(decimal)).isEqualTo("$1")
}

实际输出为“$0”。这里的“UP”不是我想要的舍入模式吗? AFAICT 从文档来看,确实如此。当我连接调试器时,decimal0.01,所以这似乎不是问题。我也尝试过非 Currency NumberFormat,它具有相同的行为

最佳答案

主要问题是RoudingMode:

Each rounding mode indicates how the least significant returned digit of a rounded result is to be calculated.

因此,换句话说,0.01 将四舍五入为 0.1(对最低有效数字进行四舍五入)...当您将 setMaximumFractionDigits 设置为 0 时,所有十进制数字都将被丢弃,只留下 0

因此,如果您想对两个不太有效的数字进行四舍五入,则必须实现一些逻辑来对数字进行两次四舍五入(或搜索如何执行此操作...我目前正在搜索,稍后可能会更新此答案)。

更新

使用BigDecimal可以实现您想要的目的。它支持您想要的这种“递归回合”操作。在java中,你的代码将变成:

@Test
public void testFormatRoundedUp() {
NumberFormat formatter = NumberFormat.getCurrencyInstance();
formatter.setMaximumFractionDigits(0);
formatter.setCurrency(Currency.getInstance("USD"));

double decimal = 1 / 100.0;
BigDecimal decimalValue = new BigDecimal(decimal);

Assert.assertThat("Format: 0.01", formatter.format(decimalValue.setScale(0, RoundingMode.UP)), equalTo("US$ 1"));
}

关于Java NumberFormat 在 "UP"模式下舍入不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com