将数字截断到指定小数位我需要将一个数字截断到小数点后2位,基本上就是去掉多余的数字。例如:2.919->2.912.91111->2.91为什么?这就是SQLServer在存储多个特定精度时所做的事情。例如,如果该列是decimal(8,2),并且您尝试插入/更新数字9.1234,则3和4将被截断。我需要在C#代码中做同样的事情。我能想到的唯一可能的方法是:使用stringformatter以两位小数“打印”出来,然后将其转换为小数,例如:decimaltooManyDigits=2.1345decimalShorterDigits=Convert.ToDecimal(tooManyDigits.ToString("0.##"));//ShorterDigits现在是2.13我对此并不满意,因为它涉及一个字符串后跟另一个字符串到十进制的转换,这似乎有点疯狂。使用Math.Truncate(它只接受整数),所以我可以将它乘以100,截断它,然后除以100。例如:decimaltooLongDecimal=2.1235;tooLongDecimal=Math.Truncate(tooLongDecimal*100)/100;我对此也不满意,因为如果tooLongDecimal为0,我会得到除以0的错误。当然还有更好+更简单的方法!有什么建议么?您自己回答了问题;您似乎误解了除以零的含义。正确的做法是乘法、截断,然后赋值,如下所示:decimalTruncateTo100ths(decimald){returnMath.Truncate(d*100)/100;}TruncateTo100ths(0m);//0TruncateTo100ths(2.919m);//2.91TruncateTo100ths(2.91111m);//2.91TruncateTo100ths(2.1345m);//2.13没有被零除,只有被100除,绝对安全。先前提供的数学解决方案容易溢出大量数字和/或大量小数位。考虑以下扩展:[System.Runtime.CompilerServices.Extension()]publicstaticdecimalTruncateDecimal(decimald,intdecimals){if(decimals28)thrownewArgumentOutOfRangeException("decimals","Valuemustbeinrange0-28”);elseif(decimals=0)returnMath.Truncate(d);else{十进制整数部分=Math.Truncate(d);十进制比例因子=d-integerPart;十进制乘数=Math.Pow(10,decimals);scalingFactor=Math.Truncate(scalingFactor*multiplier)/multiplier;返回整数部分+比例因子;}}用法:十进制值=18446744073709551615.262626263m;值=值.TruncateDecimal(6);经验和截断的更一般化的功能。http://snathani.blogspot.com/2014/05/truncating-number-to-specificnumber-of.htmlpublicstaticdecimalTruncate(decimalvalue,intdecimals){decimalfactor=(decimal)Math.Pow(10,decimals)});十进制结果=Math.Truncate(factor*value)/factor;返回结果;}使用decimal.ToString('0.##')也强制四舍五入:1.119M.ToString("0.##")//->1.12(是的,可能应该是注释,但很难像这样格式化.)以上是C#学习教程:截断数字到指定小数位。了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
