Java大小数或双倍

时间:2016-01-29 01:49:15

标签: java floating-point type-conversion bigdecimal

我有一个数字,格式为(13,2)13位和2位小数。我需要对它进行一些计算(比如乘法,除法)。我打算用BigDecimal进行计算。我应该使用double或float进行计算,因为BigDecimal有点慢吗?

2 个答案:

答案 0 :(得分:7)

最重要的考虑因素不是速度而是正确性。

如果您的值是continuous value的样本,就像对大小,距离,重量,角度等真实世界属性的衡量,那么IEEE-754 doublefloat可能是更好的选择。这是因为在这种情况下,10的权力不一定是“更圆的”。比其他值(例如,弧度中的角度测量值可以是超越数,但仍然是#34; round")。

如果您的值是discrete value,如衡量金额,则 double不正确,而BigDecimal等浮点小数类型是正确的。这是因为,在这种情况下,离散增量是有意义的,值为" 0.01"是"圆的"并且比#34; 0.009999999999999"或" 0.010000000000000001"。

答案 1 :(得分:0)

具有两位小数的数据的最简单,最自然的表示是BigDecimal,其中包含比例因子2.从此开始。在大多数情况下,它会足够快。

如果在测量时确实存在严重的性能问题,还有两个选择:

  1. 使用long表示百分之数。例如,美国货币可以精确地表示为long分数。要非常小心,确保变量名称和注释清楚地表明使用美元的地方以及使用美分的地方。
  2. 使用double将金额表示为分数。这避免了美元与美分的簿记,而不考虑舍入问题。您可能需要通过乘以100,舍入到最接近的整数,然后再除以100来定期更正舍入