Saxon XSLT sum函数计算异常问题咨询
问题解答
这是典型的二进制浮点数精度误差问题,并非Saxon的bug:
- 十进制小数如
196.30和1018.57无法被二进制浮点数精确存储(类似十进制无法精确表示1/3),在计算过程中会积累微小的精度偏差,最终导致结果出现1214.8700000000001这类近似值。
针对这个问题,有两种常用解决方式:
使用精确的十进制类型计算
在XSLT中显式将数值转换为xs:decimal类型,它基于十进制存储,能避免浮点数精度损失:sum(($value1, $value2) ! xs:decimal(.))这种方式适合对精度要求高的场景(比如货币计算)。
格式化结果修正显示
如果无法切换类型,可通过format-number函数将结果四舍五入到指定小数位数:format-number(sum(($value1, $value2)), '#.00')该方式会将结果格式化为保留两位小数的字符串,输出
1214.87。
内容的提问来源于stack exchange,提问作者Srii
相关产品推荐
相关产品推荐

