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

在C#中,我试图得到一个双精度的最后两位小数,没有四舍五入。 我已经尝试了从Math.FloorMath.Truncate所有内容, Math.Floor没有任何工作。

我想要的结果样本:

 1,424.2488298 -> 1,424.24 53.5821 -> 53.58 10,209.2991 -> 10,209.29 

有任何想法吗?

好吧,数学上很简单:

 var f = 1.1234; f = Math.Truncate(f * 100) / 100; // f == 1.12 

将小数点后两位移到右侧,转换为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; } 

我的建议:首先停止使用double 。 如果你需要十进制舍入,那么赔率是好的,你应该使用decimal 。 你的申请是什么?

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

 double r = whatever; decimal d = (decimal)r; decimal truncated = decimal.Truncate(d * 100m) / 100m; 

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

  double d = Math.Truncate(d * 100) / 100; 

一般解决方案:

  public static double SignificantTruncate(double num, int significantDigits) { double y = Math.Pow(10, significantDigits); return Math.Truncate(num * y) / y; } 

然后

  double x = 5.3456; x = SignificantTruncate(x,2); 

将产生所需的结果x=5.34

 Math.Round(NumberToRound - (double)0.005,2) 

 Math.Round(53.5821 - (double)0.005,2) // 53.58 Math.Round(53.5899 - (double)0.005,2) // 53.58 Math.Round(53.5800 - (double)0.005,2) // 53.58