gpt4 book ai didi

math - 具有RoundingMode.HALF_UP的DecimalFormat

转载 作者:行者123 更新时间:2023-12-02 13:37:13 32 4
gpt4 key购买 nike

拥有简单的代码

import java.math.RoundingMode
import java.text.DecimalFormat

fun main(args: Array<String>) {
val f = DecimalFormat("#.##").apply { roundingMode = RoundingMode.HALF_UP }
println(f.format(-0.025f))
println(f.format(-0.015f))
println(f.format(-0.005f))
println(f.format(0.005f))
println(f.format(0.015f))
println(f.format(0.025f))
}
我得到以下输出:

-0,03 <-- ok

-0,01 <-- expecting -0,02

-0 <-- expecting -0,01

0 <-- expecting 0,01

0,01 <--- expecting 0,02

0,03 <-- ok


我是否正确理解 RoundingMode.HALF_UP的含义?
P.S.
我发现,使用double代替float可以解决问题。因此, println(f.format(0.005.toDouble()))可以正常工作,并提供预期的 0.1

最佳答案

关于RoundingMode.HALF_UP的文档说的是:

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.



尽管这看起来像您要查找的行为,但它们是十进制浮点数,很难在内存中表示出来。在 the Oracle site上有很多读物。

因此,似乎-0.005和-0.015都比其他任何东西都更接近(最近邻居)-0.01,因此它们的格式都为-0.01。要使代码执行您想要的操作,就是将舍入模式更改为:
roundingMode = RoundingMode.UP

运行的输出是:
-0.03
-0.02
-0.01
0.01
0.02
0.03

正是您所期望的。如果您确实希望代码正常工作,则可以使用以下方法:
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat

fun main(args: Array<String>) {
val f = DecimalFormat("#.##").apply { roundingMode = RoundingMode.HALF_UP }
println(f.format( BigDecimal("-1000.045")))
println(f.format( BigDecimal("-1000.035")))
println(f.format( BigDecimal("-1000.025")))
println(f.format( BigDecimal("-1000.015")))
println(f.format( BigDecimal("-1000.005")))
}

关于math - 具有RoundingMode.HALF_UP的DecimalFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53740617/

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