小李算订单折扣,两个int一除,7除以2想得到3.5,结果得到3,钱直接算少了,他以为是精度问题,其实是整数除法先截断了。

int除以int,先把类型转掉

C#里两个整数相除,结果自动就是整数,小数部分直接扔掉,不四舍五入。想要小数,得先让其中一个变成double或decimal。

int a = 7, b = 2;
double r = (double)a / b;   // 3.5
// 写成 a / b 结果是 3

转一个就够了,另一个会自动提升。别写成a除以b再转double,那时候已经晚了一步。

保留两位的几种写法

  • Math.Round:Math.Round(value, 2)只控制精度,不补零
  • ToString:value.ToString(0.00)会显示两位并且补零,适合展示
  • decimal:金额场景用decimal,double有浮点误差,算钱容易差几分
decimal money = 19.90m / 3m;
string s = money.ToString(F2);   // 6.63
string t = money.ToString(0.00); // 6.63

注意Math.Round默认是银行家舍入,0.125会舍成0.12而不是0.13。要按我们习惯的四舍五入,得加MidpointRounding.AwayFromZero。

Math.Round(0.125, 2, MidpointRounding.AwayFromZero); // 0.13

展示和存储分开处理

数据库里的金额字段用decimal,别用float和double存钱。算完了要显示两位,只在输出那一层格式化,中间计算过程保留更高精度,避免每步都截断导致误差累积。

一句话取舍:金额一律decimal,格式化用F2或者0.00,涉及对账的舍入规则先跟财务确认再写死。