import java.math.BigDecimal
BigDecimal(0.235).setScale(2, BigDecimal.ROUND_HALF_UP) // 0.23
BigDecimal("0.235").setScale(2, BigDecimal.ROUND_HALF_UP) // 0.24
在kotlin中,当输入0.235设为两倍时,输出为0.23。 当输入0.235作为字符串给出时,输出为0.24
以下是文档中给出的ROUND_HALF_UP的定义:
舍入模式,其中值四舍五入到最接近的值 邻居。向上舍入会破坏关系。
答案 0 :(得分:1)
来自BigDecimal
docs:
- 此构造函数的结果可能有些不可预测。可能有人假设用Java编写新的
BigDecimal(0.1)
会创建一个BigDecimal
正好等于0.1(非标度值为1, 比例为1),但实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为不能将0.1精确地表示为双精度(或为此 物质,作为任何有限长度的二进制分数)。因此,价值 in 传递给构造函数的过程不完全等于 0.1,尽管有外观。- 另一方面,String构造函数是完全可以预测的:编写
new BigDecimal("0.1")
会创建一个BigDecimal
正如人们所期望的,它等于0.1。因此它是 通常建议String constructor 优先使用此版本。
答案 1 :(得分:0)
这里的问题是,在第一种情况下,您正在使用浮点(读取:不完全)文字来调用BigDecimal
构造函数。考虑以下脚本(在Java中):
BigDecimal blah = new BigDecimal(0.235d);
System.out.println(blah);
这将在我的演示工具中打印0.23499999999999998667732370449812151491641998291015625
。也就是说,您实际上并没有传递文字0.235
,而是传递了一个近似的浮点数。在这种情况下,实际字面值实际上小于0.235
,导致舍入取整结果为0.23
,而不是0.24
。