在C#中,我试图得到一个双精度的最后两位小数,没有四舍五入。我已经尝试了从Math.Floor
到Math.Truncate
的所有内容,但没有任何效果。
我想要的结果样本:
1,424.2488298 -> 1,424.24
53.5821 -> 53.58
10,209.2991 -> 10,209.29
有什么想法吗?
答案 0 :(得分:23)
嗯,数学上很简单:
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;
}
答案 1 :(得分:14)
我的建议:首先停止使用double
。如果你需要十进制舍入,那么你应该使用decimal
的赔率很高。你的申请是什么?
如果你有双,你可以这样做:
double r = whatever;
decimal d = (decimal)r;
decimal truncated = decimal.Truncate(d * 100m) / 100m;
请注意,如果double的绝对值大于792281625142643375935439504,则此技术将失败,因为乘以100将失败。如果您需要处理大的值,那么您将需要使用特殊技术。 (当然,在双倍大的时候,你还远远超出它在小数位后用两位数表示值的能力。)
答案 2 :(得分:6)
double d = Math.Truncate(d * 100) / 100;
答案 3 :(得分:2)
一般解决方案:
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
。
答案 4 :(得分:2)
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