在C#中,我想获取一个double类型数字的最后两位,不进行任何舍入。我已经尝试过从Math.Floor
到Math.Truncate
的所有方法,但都没有成功。
以下是我想要的结果示例:
1,424.2488298 -> 1,424.24
53.5821 -> 53.58
10,209.2991 -> 10,209.29
有什么想法吗?
在C#中,我想获取一个double类型数字的最后两位,不进行任何舍入。我已经尝试过从Math.Floor
到Math.Truncate
的所有方法,但都没有成功。
以下是我想要的结果示例:
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
将小数点向右移动两位,强制转换为整数以截断小数部分,再将其向左移动两位。可能还有一些框架中的方法可以实现,但我现在不能查看。您可以将其泛化:
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;
}
136.2
,136.20
和136.2000000
之间没有区别。如果您想以特定的显示位数打印,则可以查看对String.Format
的调用中的字符串格式设置。 - Ed S.我的建议是:首先停止使用double
。如果你需要十进制舍入,那么很可能你应该使用decimal
。请问你的应用程序是什么?
如果你确实有一个double
,可以这样做:
double r = whatever;
decimal d = (decimal)r;
decimal truncated = decimal.Truncate(d * 100m) / 100m;
请注意,如果双精度浮点数的绝对值大于792281625142643375935439504,则此技术将失败,因为乘以100会失败。 如果您需要处理如此大的值,则需要使用特殊技术。(当然,当一个双精度浮点数如此大时,它已经远远超出了以两位小数表示值的能力。)
double d = Math.Truncate(d * 100) / 100;
Math.Round(NumberToRound - (double)0.005,2)
i.e
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
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
。
Octane 对你的回答进行了概括,它不会受到超过最大值的影响。运行得非常好:)
int dec = 4;
return Math.Round(val - (decimal)(5 / Math.Pow(10,dec+1)), dec)