获取最后2个没有舍入的小数位数

min*_*int 8 c# decimal rounding

在C#中,我试图得到一个双精度的最后两位小数,没有四舍五入.我从什么都试过Math.FloorMath.Truncate,并没有什么工作.

我想要的结果样本:

1,424.2488298 -> 1,424.24
53.5821 -> 53.58
10,209.2991 -> 10,209.29
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ed *_* S. 23

好吧,数学上很简单:

var f = 1.1234;
f = Math.Truncate(f * 100) / 100;  // f == 1.12
Run Code Online (Sandbox Code Playgroud)

将小数点后两位移到右侧,转换为int以截断,将其移回左侧两个位置.框架中可能还有一些方法可以做到这一点,但我现在看不出来.你可以概括一下:

double Truncate(double value, int places)
{
    // not sure if you care to handle negative numbers...       
    var f = Math.Pow( 10, places );
    return Math.Truncate( value * f ) / f;
}
Run Code Online (Sandbox Code Playgroud)

  • @mint:嗯,现在你谈的是显示器,而不是数字本身.`136.2`,`136.20`和`136.2000000`没有区别.如果要打印显示一定数量的位置,则在调用`String.Format`时查看字符串格式. (6认同)

Eri*_*ert 14

我的建议是:停止使用double摆在首位.如果你需要十进制舍入,那么你应该使用的赔率很高decimal.你的申请是什么?

如果你有双,你可以这样做:

double r = whatever;
decimal d = (decimal)r;
decimal truncated = decimal.Truncate(d * 100m) / 100m;
Run Code Online (Sandbox Code Playgroud)

请注意,如果double的绝对值大于792281625142643375935439504,则此技术将失败,因为乘以100将失败.如果您需要处理大的值,那么您将需要使用特殊技术.(当然,到双倍大的时候,你的能力远远超出它在小数位后用两位数表示值的能力.)


ion*_*den 6

 double d = Math.Truncate(d * 100) / 100;
Run Code Online (Sandbox Code Playgroud)