Dart中toStringAsFixed与NumberFormat数值处理结果差异的疑问
为什么2.385和1.385的取整结果不一致?
这本质是二进制浮点数的精度限制导致的问题——十进制里的很多小数(比如0.005)无法用二进制有限位精确表示,所以你写的2.385和1.385在内存中存储的实际值并不是精确的十进制数。
具体来看:
2.385实际存储的二进制浮点数略小于2.385(近似值比如2.3849999999999996),当调用toStringAsFixed(2)时,第三位小数的实际值不足0.005,所以会被舍去,得到2.38。1.385实际存储的二进制浮点数略大于1.385(近似值比如1.3850000000000001),第三位小数的实际值超过0.005,取整时会进一位,得到1.39。
你用NumberFormat得到相同结果,是因为它底层同样依赖浮点数的存储值进行计算,自然会受同样的精度问题影响。
如果是货币这类对精度要求极高的场景,绝对不能用double这类浮点数类型。建议使用专门的十进制精确计算类型,比如Dart中的decimal包,或者直接用整数存储分(而非元)来避免浮点误差。
内容的提问来源于stack exchange,提问作者kai91
相关产品推荐
相关产品推荐

