四舍五入问题(粗糙版)
StringBuilder str = new StringBuilder(); float hh = 2.345f; float hh2 = 2.355f; double tt1 = 526.955; double tt2 = 526.945; double tt3 = 526.935; decimal ss1 = 4.445M; decimal ss2 = 4.435M; str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", tt1, tt1.GetType(), tt1.ToString("0.00")); str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", tt2, tt2.GetType(), tt2.ToString("0.00")); str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", hh, hh.GetType(), hh.ToString("0.00")); str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", hh2, hh2.GetType(), hh2.ToString("0.00")); str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", ss1, ss1.GetType(), ss1.ToString("0.00")); str.AppendFormat("{0}类型为{1},tostring(\"0.00\")计算结果为{2}<br/>", ss2, ss2.GetType(), ss2.ToString("0.00")); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", hh, hh.GetType(), Math.Round(hh, 2)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", hh2, hh2.GetType(), Math.Round(hh2, 2)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/>", hh, hh.GetType(), Math.Round(hh, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/><br/>", hh2, hh2.GetType(), Math.Round(hh2, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("数字{0},Math.Round计算结果为{1}<br/>", "6.345", Math.Round(6.345, 2)); str.AppendFormat("数字{0},Math.Round计算结果为{1}<br/>", "6.355", Math.Round(6.355, 2)); str.AppendFormat("数字{0},Math.Round计算结果为{1}<br/>", "6.335", Math.Round(6.335, 2)); str.AppendFormat("数字{0},Math.Round附加,计算结果为{1}<br/>", "6.345", Math.Round(6.345, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("数字{0},Math.Round附加,计算结果为{1}<br/>", "6.355", Math.Round(6.355, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("数字{0},Math.Round附加,计算结果为{1}<br/><br/>", "6.335", Math.Round(6.335, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", tt1, tt1.GetType(), Math.Round(tt1, 2)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", tt2, tt2.GetType(), Math.Round(tt2, 2)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/><br/>", tt3, tt3.GetType(), Math.Round(tt3, 2)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/>", tt1, tt1.GetType(), Math.Round(tt1, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/>", tt2, tt2.GetType(), Math.Round(tt2, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/><br/>", tt3, tt3.GetType(), Math.Round(tt3, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", ss1, ss1.GetType(), Math.Round(ss1, 2)); str.AppendFormat("{0}类型为{1},Math.Round计算结果为{2}<br/>", ss2, ss2.GetType(), Math.Round(ss2, 2)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/>", ss1, ss1.GetType(), Math.Round(ss1, 2, MidpointRounding.AwayFromZero)); str.AppendFormat("{0}类型为{1},Math.Round附加,计算结果为{2}<br/>", ss2, ss2.GetType(), Math.Round(ss2, 2, MidpointRounding.AwayFromZero)); Response.Write(str);
下面都是测试数据
526.955类型为System.Double,tostring("0.00")计算结果为526.96
526.945类型为System.Double,tostring("0.00")计算结果为526.95
2.345类型为System.Single,tostring("0.00")计算结果为2.35
2.355类型为System.Single,tostring("0.00")计算结果为2.36
4.445类型为System.Decimal,tostring("0.00")计算结果为4.45
4.435类型为System.Decimal,tostring("0.00")计算结果为4.44
2.345类型为System.Single,Math.Round计算结果为2.35
2.355类型为System.Single,Math.Round计算结果为2.36
2.345类型为System.Single,Math.Round附加,计算结果为2.35
2.355类型为System.Single,Math.Round附加,计算结果为2.36
数字6.345,Math.Round计算结果为6.34
数字6.355,Math.Round计算结果为6.36
数字6.335,Math.Round计算结果为6.34
数字6.345,Math.Round附加,计算结果为6.35
数字6.355,Math.Round附加,计算结果为6.36
数字6.335,Math.Round附加,计算结果为6.34
526.955类型为System.Double,Math.Round计算结果为526.96
526.945类型为System.Double,Math.Round计算结果为526.95
526.935类型为System.Double,Math.Round计算结果为526.93
526.955类型为System.Double,Math.Round附加,计算结果为526.96
526.945类型为System.Double,Math.Round附加,计算结果为526.95
526.935类型为System.Double,Math.Round附加,计算结果为526.93
4.445类型为System.Decimal,Math.Round计算结果为4.44
4.435类型为System.Decimal,Math.Round计算结果为4.44
4.445类型为System.Decimal,Math.Round附加,计算结果为4.45
4.435类型为System.Decimal,Math.Round附加,计算结果为4.44
总结
用tostring("0.00")对float,double,decimal都实现四舍五入
用Math.Round对float实现四舍五入,decimal附加MidpointRounding.AwayFromZero才参数能实现,double都不适用
总结为四舍五入问题:要么用toString("0.00"),要么用 Math.Round((decimal)num,2,MidpointRounding.AwayFromZero)