你是对的,双打发生了一些奇怪的事情,打印出来的内容与变量的内容不同。
例如:
groovy:000> "123.0001".toBigDecimal()
===> 123.0001
groovy:000> "123.0001".toDouble()
===> 123.0001
groovy:000> new BigDecimal("123.0001".toDouble())
===> 123.000100000000003319655661471188068389892578125
请注意,损坏是在将字符串转换为双精度时造成的,而不是在将双精度传递给 BigDecimal 时。将 double 提供给 BigDecimal 只是提供了一种简单的方法来查看 double 中的实际内容,因为 toString 是在骗你。
正如 Jon Skeet 指出的那样,准确性不是这里的选择。但是,假设屏幕上打印的值是在 double 上调用 toString 的结果,您应该能够得到一个与 double 的 toString 版本一样错误的 bigDecimal,如下所示:
groovy:000> d = "123.0001".toDouble()
===> 123.0001
groovy:000> d.toString()
===> 123.0001
groovy:000> new BigDecimal(d.toString())
===> 123.0001
所以你不需要涉及 BigDecimal,真的,你可以做类似的事情
groovy:000> d = 123.0001
===> 123.0001
groovy:000> s = d.toString()
===> 123.0001
groovy:000> s.substring(s.indexOf('.')).length() - 1
===> 4
很抱歉通过编辑使您的评论无效。
顺便说一句,这里的东西接近史蒂夫的回答,翻译成时髦的。(我对未找到的小数点进行了测试,因为如果你在一台机器上运行它并且语言环境搞砸了所以它没有使用小数点的句点,我宁愿它炸毁而不是返回 0)
def getPlaces(d) {
s = d.toString()
s.substring(s.indexOf(".")).length() - 1
}