You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy中Long类型值相加丢失小数部分问题求助

问题根源

你遇到的计算错误核心原因是Long是整数类型:当把带小数的数值(比如2.5)赋值给Long变量时,小数部分会被直接截断,只保留整数部分。比如测试用的2.5会被转成2,四个2相加得到8,除以3自然得到2.67,和预期的10/3≈3.33不符。

解决方案

把所有参与计算的变量类型从Long改成BigDecimal——这是处理金额等精确数值计算的标准做法,能完整保留小数部分,避免精度丢失。

修改后的代码示例

// 将变量类型改为BigDecimal,确保保留小数精度
BigDecimal val1 = makeNullZero(getCustomFieldValue('Benefit 1 Annual $'));
BigDecimal val2 = makeNullZero(getCustomFieldValue('Benefit 2 Annual $'));
BigDecimal val3 = makeNullZero(getCustomFieldValue('Benefit 3 Annual $'));
BigDecimal val4 = makeNullZero(getCustomFieldValue('Benefit 4 Annual $'));
BigDecimal val5 = makeNullZero(getCustomFieldValue('Estimated Development Cost $'));

// 此时计算会保留完整小数部分
BigDecimal sum = (val1 + val2 + val3 + val4) / val5;
// 使用setScale更精确控制小数位数和舍入模式,效果和round(2)一致
return sum.setScale(2, RoundingMode.HALF_UP);

关键注意点

  1. 调整makeNullZero方法:如果这个方法原本返回Long,需要修改它返回BigDecimal,确保从自定义字段获取的数值不会被提前截断。
  2. 别用Double替代:不要图省事用Double,Double处理小数时存在精度丢失问题(比如0.1 + 0.2不等于0.3),完全不适合金额场景。
  3. 舍入模式明确化:setScale(2, RoundingMode.HALF_UP)是标准的四舍五入逻辑,比单纯的round(2)更可控。

内容的提问来源于stack exchange,提问作者Amit Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:34:58