接口返回的价格是「12.50」,前端拿去做乘法,算出来的金额多了一百倍。查了半小时才发现,两个字符串用加号连起来,做的是拼接不是相加。字符串转 double 看着简单,实际每种语言都埋了坑。

每种语言的正规入口

Java 用 Double.parseDouble,传进去的串前后多一个空格都会抛 NumberFormatException,最好先 trim。C# 用 double.TryParse,转换失败返回 false,不会把流程打断,做表单校验更合适。JS 的 Number 把空串和纯空格都当成 0,parseFloat 只认开头能识别的部分,两种都得自己先判空。Python 直接 float,把 None 丢进去照样报 TypeError。

C++ 用 std::stod,传「12abc」会返回 12 而且不报错,需要自己检查有没有把整个串消费完,否则脏数据会静默通过。

千分位和货币符号要先剥掉

界面上显示的「1,234.56」不是数值,直接转一定失败。先把逗号、空格、货币符号去掉,再交给 parse。跨境数据要当心:英文格式里逗号是千分位,欧洲格式里逗号是小数点、点反而代表千分位,认错就差了三个数量级。

金额别用 double

0.1 加 0.2 得到 0.30000000000000004,这不是语言抽风,是二进制浮点的固有特性。凡是跟钱、库存、结算有关的字段,Java 用 BigDecimal,C# 用 decimal,数据库列用 DECIMAL,构造时传字符串,别拿 double 中转一次再转回来。

批量导入时按四步拆开

先判空,再 trim,再去符号,最后转换,四步分开写,出错能定位到第几步。整批数据里混了脏值,把行号和原值一起记进日志,比只报一句格式错误好查得多。转完还要看范围,库存数量转出负数,说明上游数据本身有问题,别急着在转换这一层补救。

判断很简单:数字要参与金钱运算就换定点类型,只做展示、排序、统计,double 完全够用。