C#如何将数值截断保留两位小数,无尾部零则省略?
在C#中实现数值截断保留两位小数并去除尾部零的方法
要实现需求,需要分两步:先对数值进行向下取整(截断)到两位小数,再格式化输出以去除尾部的零和多余小数点。以下是针对不同数值类型的具体实现:
1. 核心思路
- 截断处理:将数值乘以100后取向下取整,再除以100,得到保留两位小数的截断结果。
- 格式化输出:使用自定义格式字符串,让结果仅在有非零小数部分时显示小数位,否则只显示整数部分。
2. 针对不同类型的代码实现
处理decimal类型
decimal精度无损失,直接计算即可:
decimal input1 = 77.1455m; decimal input2 = 52.00m; decimal input3 = 714.1554m; decimal input4 = 5552.0001m; // 截断到两位小数 decimal truncated1 = Math.Floor(input1 * 100) / 100; decimal truncated2 = Math.Floor(input2 * 100) / 100; decimal truncated3 = Math.Floor(input3 * 100) / 100; decimal truncated4 = Math.Floor(input4 * 100) / 100; // 格式化输出 string result1 = truncated1.ToString("0.##"); // "77.14" string result2 = truncated2.ToString("0.##"); // "52" string result3 = truncated3.ToString("0.##"); // "714.15" string result4 = truncated4.ToString("0.##"); // "5552"
处理double/float类型
由于浮点数存在精度问题,建议先转换为decimal再处理,避免计算误差:
double input1 = 77.1455; double input2 = 52.00; double input3 = 714.1554; double input4 = 5552.0001; // 转换为decimal后截断,再转回double double truncated1 = (double)Math.Floor((decimal)input1 * 100) / 100; double truncated2 = (double)Math.Floor((decimal)input2 * 100) / 100; double truncated3 = (double)Math.Floor((decimal)input3 * 100) / 100; double truncated4 = (double)Math.Floor((decimal)input4 * 100) / 100; // 格式化输出 string result1 = truncated1.ToString("0.##"); // "77.14" string result2 = truncated2.ToString("0.##"); // "52" string result3 = truncated3.ToString("0.##"); // "714.15" string result4 = truncated4.ToString("0.##"); // "5552"
3. 格式字符串说明
"0.##"的作用:
0:强制显示整数部分,即使数值为0也会显示。##:表示最多显示两位小数,仅当小数位有非零值时才显示,尾部的零会自动省略。
4. 为什么之前的方法无效?
String.Format("0.00"):强制显示两位小数,所以52.00会输出"52.00",不符合需求。String.Format("G29"):会保留数值的有效数字,但不会进行截断处理,原始数值的小数部分会被保留,无法得到截断后的结果。
内容的提问来源于stack exchange,提问作者Adam Brown
相关产品推荐
相关产品推荐

