我有一个输入表,我正在尝试读取一行,其中我感兴趣的列值是0.070070073108537356(总共20位,小数点后18位)

我将读取首选项设置为使用Spark DecimalType(precision = 38, scale = 18) 读取,这是表示 java.math.BigDecimal 值的数据类型 . 当我读到这个值时,我最终获得了0.070070073108537360,它的等级为18,但似乎是将数字四舍五入以创建一个具有相同比例但是向上舍入值的新小数 .

我认为 BigDecimal.setScale(18) 会给我与输入完全相同的数字,因为它在小数点后面有18位数字 .

谁能解释为什么BigDecimal会结束?

看起来像是一个错误的1,并且使用19的比例将给我我想要的数字 .

更新:经过一些测试,如果我使用小数为16或更小的小数,似乎不会发生这种舍入问题 . 一旦我将其提升到17的等级,小数点后的十进制数为17,它就会开始四舍五入 .