Kotlin在BigDecimal中四舍五入

时间:2020-10-07 05:31:51

标签: kotlin rounding bigdecimal

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的定义:

舍入模式,其中值四舍五入到最接近的值 邻居。向上舍入会破坏关系。

2 个答案:

答案 0 :(得分:1)

来自BigDecimal docs

  1. 此构造函数的结果可能有些不可预测。可能有人假设用Java编写新的BigDecimal(0.1)会创建一个 BigDecimal正好等于0.1(非标度值为1, 比例为1),但实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为不能将0.1精确地表示为双精度(或为此 物质,作为任何有限长度的二进制分数)。因此,价值 in 传递给构造函数的过程不完全等于 0.1,尽管有外观。
  2. 另一方面,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