在十进制(双精度)后舍入数字的最快方法是什么?

时间:2009-07-07 21:44:35

标签: c#

前,我的号码是345.38,223.805555,21.3333。我想得到小数点后的数字并将其四舍五入。

345.38 --> 4

2323.805555 --> 8

21.3333 --> 3

6 个答案:

答案 0 :(得分:7)

乘以10

上限(总是向上舍入,如果低于0.5,则使用'round'向下舍入)

按10

查找修改结果

像:

float myFloat = 123.38f;
float myBiggerFloat = Math.Ceiling(myFloat * 10.0f);
int theAnswer = ((int)myBiggerFloat % 10);

或者只是在SO上寻求家庭作业的帮助,无论哪种方式似乎都有效。

答案 1 :(得分:4)

这可以避免潜在的溢出问题:

decimal value;
string[] sep = new[] { NumberFormatInfo.CurrentInfo.NumberDecimalSeparator };
String.Format("{0:0.0}", Math.Round(value, 1)).Split(sep, StringSplitOptions.None)[1][0];

<击>

这可以避免字符串转换和溢出问题:

decimal value;
decimal absValue = Math.Abs(value);
decimal fraction = absValue - Math.Floor(absValue);
int lastDigit = Convert.ToInt32(10 * Math.Round(fraction, 1));

答案 2 :(得分:0)

得到小数部分,乘以10,然后舍入:

double n = 345.38;
int digit = (int)Math.Round((n - Math.Floor(n)) * 10);

这可以避免任何溢出问题,因为在转换为int时结果已经降到一位数。

我已经确认这会为您的示例提供所需的结果。

答案 3 :(得分:0)

这整个溢出的讨论有点学术性,很可能不是你的功课的意图。但是你想解决这个问题:

decimal value = -0.25m;
decimal fractionalPart = Math.Abs(value - Math.Truncate(value));
int digit = (int)Math.Round(10 * fractionalPart, MidpointRounding.AwayFromZero);

编辑:在再次阅读您的问题之后,我注意到数字不应该像我原来的答案一样整理向上。但是,大多数使用Math.Round的人都使用默认银行家的舍入(到偶数)。这取决于你是否打算-0.25得到2或3.我正在阅读你的描述的方式,它应该是3,就像在这个例子中一样。

答案 4 :(得分:0)

如果你只是想要紧跟小数点后面的数字...你不能做这样的事吗?

float value;
int digit = (int)(((value % 1) * 10) + 0.5)

答案 5 :(得分:-1)

float myNum = 10.11;
char c = myNum[myNum.ToString().IndexOf(".") + 1];