C# 小数点(双精度)后的数字四舍五入的最快方法是什么?

C# 小数点(双精度)后的数字四舍五入的最快方法是什么?,c#,C#,例如,我的电话号码是345.38、2323.805555、21.3333。我想得到小数点后的数字并将其四舍五入 345.38 --> 4 2323.805555 --> 8 21.3333 --> 3 乘以10 天花板(始终向上舍入,如果低于0.5,则使用“舍入”向下舍入) 按10查找修改的结果 比如: 或者只是请求别人帮你做家庭作业,这样,两种方法似乎都管用。乘以10 天花板(始终向上舍入,如果低于0.5,则使用“舍入”向下舍入) 按10查找修改的结果 比如: 或者只是

例如,我的电话号码是345.38、2323.805555、21.3333。我想得到小数点后的数字并将其四舍五入

345.38 --> 4

2323.805555 --> 8

21.3333 --> 3
乘以10

天花板(始终向上舍入,如果低于0.5,则使用“舍入”向下舍入)

按10查找修改的结果

比如:

或者只是请求别人帮你做家庭作业,这样,两种方法似乎都管用。

乘以10

天花板(始终向上舍入,如果低于0.5,则使用“舍入”向下舍入)

按10查找修改的结果

比如:

或者只是请求帮助完成你的家庭作业,无论哪种方式都似乎有效。

这避免了潜在的溢出问题:

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));

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

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));
这样可以避免潜在的溢出问题:

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));

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

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));

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

double n = 345.38;
int digit = (int)Math.Round((n - Math.Floor(n)) * 10);
这避免了任何溢出问题,因为当转换为int时,结果已降至一位


我已经验证过,这为您的示例提供了所需的结果。

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

double n = 345.38;
int digit = (int)Math.Round((n - Math.Floor(n)) * 10);
这避免了任何溢出问题,因为当转换为int时,结果已降至一位


我已经证实,这为您的示例提供了所需的结果。

整个讨论有点学术性,很可能不是您的家庭作业的意图。但如果你想解决这个问题:

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

编辑:在再次阅读你的问题后,我注意到数字不应该总是像我原来的答案那样向上取整。然而,大多数人使用数学。这里使用默认的银行家四舍五入(到偶数)。这取决于您是否希望-0.25产生2或3。按照我阅读你的描述的方式,应该是3,如本例所示。

整个讨论有点学术性,很可能不是你作业的意图。但如果你想解决这个问题:

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

编辑:在再次阅读你的问题后,我注意到数字不应该总是像我原来的答案那样向上取整。然而,大多数人使用数学。这里使用默认的银行家四舍五入(到偶数)。这取决于您是否希望-0.25产生2或3。按照我阅读您描述的方式,应该是3,如本例所示。

如果您只想让数字紧跟在小数点之后……您不能这样做吗

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

如果你只想让数字紧跟在小数点之后…你就不能这样做吗

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


好的观点;如果他接近花车的实用性边缘。如果他有一个用科学记数法表示的浮点值,即使不是第十位,他是否仍然取小数点后的数字?担心浮点类型乘以10会出现溢出是有点牵强的。十进制是范围最小的一个,它的最大值仍然是7.9*10^28。对于float,我更担心的是有效数字,而不是溢出。Math.天花在最后一个用例中返回“4”,而不是“3”。用数学。取而代之的是四舍五入。他说他想“把它四舍五入”,但在最后一个例子中他是四舍五入。这就是为什么我添加了关于使用圆形与天花板的评论。他在一个案例中四舍五入,在两个案例中四舍五入。我想他一定是说“四舍五入”;如果他接近花车的实用性边缘。如果他有一个用科学记数法表示的浮点值,即使不是第十位,他是否仍然取小数点后的数字?担心浮点类型乘以10会出现溢出是有点牵强的。十进制是范围最小的一个,它的最大值仍然是7.9*10^28。对于float,我更担心的是有效数字,而不是溢出。Math.天花在最后一个用例中返回“4”,而不是“3”。用数学。取而代之的是四舍五入。他说他想“把它四舍五入”,但在最后一个例子中他是四舍五入。这就是为什么我添加了关于使用圆形与天花板的评论。他在一个案例中四舍五入,在两个案例中四舍五入。我想他一定是说“四舍五入”,我绝对不会给出这个答案。特别是如果作业没有提到必须支持的数字的长度,就更不用说了。处理长度为27位而不是28位的数字的例程不太可能是个问题。您的解决方案会因用户的区域性设置(并非所有国家都使用)而中断。将数字格式化为字符串并不快,用数字表示会更快。@Thorarin,Guffa:我已经解决了您的两个问题,并避免了溢出问题。但它不会进行任何舍入。相反,它将截断为整数。你的回答从不可靠到完全错误;)我绝对不会提交这个答案。特别是如果作业没有提到必须支持的数字的长度,就更不用说了。处理长度为27位而不是28位的数字的例程不太可能是个问题。您的解决方案会因用户的区域性设置(并非所有国家都使用)而中断。将数字格式化为字符串并不快,用数字表示会更快。@Thorarin,Guffa:我已经解决了您的两个问题,并避免了溢出问题。但它不会进行任何舍入。相反,它将截断为整数。你的回答从不可靠到完全错误;)这是截断,它总是四舍五入。这是截断,它总是四舍五入。在负数上分解。数学。截断而不是数学。地板可以防止这种情况。负数中断。Math.Truncate而不是Math.Floor将阻止此操作。根据语言的不同,%可以是整数运算,因此值%1将为零。实际上,我想不出一种语言,其中%是在浮动上定义的,但这可能是我自己的限制。维基百科说模运算是一种整数运算,