【问题标题】:Long to String before converting to a BigDecimal在转换为 BigDecimal 之前将 Long 转换为 String
【发布时间】:2016-07-23 20:02:33
【问题描述】:

我必须将 Long(对象一,包含在变量“longValueToConvert”中)转换为 BigDecimal。

我会做这样的事情:

new BigDecimal(longValueToConvert)

但我读到这种转换可能会导致转换错误,并且在将 Long 用于 BigDecimal 构造函数之前,最好将其转换为字符串。

new BigDecimal(longValueToConvert.toString())

可以使用第一个还是第二个更好?我使用 Java 8。

【问题讨论】:

  • 代码中不涉及强制转换,不,不会导致任何转换错误。

标签: java java-8 type-conversion long-integer bigdecimal


【解决方案1】:

你听错了。 BigDecimal(long) 构造函数没有转换错误。 long 可以精确地表示,用它制作 BigDecimal 没有问题。

只有在使用BigDecimal(double) 构造函数时才需要小心。这是因为某些double 值无法准确表示。来自文档:

此构造函数的结果可能有些不可预测。有人可能会假设在 Java 中编写 new BigDecimal(0.1) 会创建一个 BigDecimal,它完全等于 0.1 [...],但它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为0.1 不能完全表示为double [...]。

另一方面,String 构造函数是完全可预测的:编写 new BigDecimal("0.1") 会创建一个 BigDecimal,它完全等于 0.1,正如人们所期望的那样。因此,一般建议优先使用 String 构造函数。

【讨论】:

  • 另外,factory methods 更可取,因为它们并不总是创建新对象。
【解决方案2】:

你可以试试这个:

new BigDecimal(longValueToConvert.longValue())

这很好用。我相信您应该关心的是在表示浮点数时,因为那里的精度很重要。例如当您使用 BigDecimal (double)BigDecimal(float) 构造函数时。你有这些场景吗?此外,这里的名字告诉你一切。 Long 到任何浮点数都不是问题,但来自其他方向需要小心。

【讨论】:

  • 虽然这会起作用,但结果将与 new BigDecimal(longValueToConvert) 完全相同
  • "[将 a] long 转换为任何浮点数都不是问题" - 实际上,将 long 转换为 floatdouble 可能导致精度损失。
  • 为什么要将 long 转换为 long?对我来说没有多大意义。
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 2013-08-26
  • 2021-10-24
  • 2020-05-29
  • 2018-05-29
  • 1970-01-01
  • 2017-08-20
  • 2021-10-08
相关资源
最近更新 更多