将 double 转换为 int
Posted
技术标签:
【中文标题】将 double 转换为 int【英文标题】:convert double to int 【发布时间】:2011-05-10 01:51:52 【问题描述】:将double
转换为int
的最佳方法是什么?应该使用演员表吗?
【问题讨论】:
定义“最佳”。取决于你是否想要向上/向下舍入等。 @RPM1984:定义etc.
:)
@Armen - touche` :) 无论如何都没关系 - Skeet 在这里,其他都不重要。
【参考方案1】:
如果您想要默认截断为零的行为,您可以使用强制转换。或者,您可能想要使用 Math.Ceiling
、Math.Round
、Math.Floor
等 - 尽管之后您仍然需要演员表。
不要忘记int
的范围远小于double
的范围。如果值在未经检查的上下文中超出int
的范围,则从double
到int
的转换不会引发异常,而对Convert.ToInt32(double)
的调用会。如果值超出范围,则强制转换的结果(在未经检查的上下文中)显式未定义。
【讨论】:
@user:int
的大小始终为 32 位,无论您使用的是 32 位还是 64 位机器。
而且双精度数甚至比 64 位整数还要大。
对于像我这样的 C# 菜鸟:数学和转换都是系统的一部分。所以完整的答案看起来像这样:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
@user1290746:可以,但您通常只会在文件顶部有using System;
,此时它可能只是intVal = Convert.ToInt32(Math.Floor(dblVal));
@user1290746:但在这种情况下,我认为建议人们使用完全限定名称不是正确的解决方案 - 更好的解决方案是了解 using
指令。跨度>
【参考方案2】:
如果您使用强制转换,即(int)SomeDouble
,您将截断小数部分。也就是说,如果SomeDouble
是 4.9999,则结果将是 4,而不是 5。转换为 int 不会对数字进行四舍五入。如果你想四舍五入使用Math.Round
【讨论】:
【参考方案3】:是的,为什么不呢?
double someDouble = 12323.2;
int someInt = (int)someDouble;
使用Convert
类也很有效。
int someOtherInt = Convert.ToInt32(someDouble);
【讨论】:
【参考方案4】:Convert.ToInt32
是最好的转化方式
【讨论】:
这是一个典型的不安全函数,因为它只接受任何东西。【参考方案5】:最好的方法是简单地使用Convert.ToInt32
。它速度很快,也可以正确地四舍五入。
为什么要让它变得更复杂?
【讨论】:
【参考方案6】:我的方法是:
- Convert.ToInt32(double_value)
- (int)double_value
- Int32.Parse(double_value.ToString());
【讨论】:
你不觉得第三种方式过于复杂和缓慢吗? 第三个不适用于带有小数部分的双打。例如,double_value = 0.1
我认为你可以使用 Math.Floor。【参考方案7】:
这是一个完整的例子
class Example
public static void Main()
double x, y;
int i;
x = 10.0;
y = 3.0;
// cast double to int, fractional component lost (Line to be replaced)
i = (int) (x / y);
Console.WriteLine("Integer outcome of x / y: " + i);
如果要将数字四舍五入为更接近的整数,请执行以下操作:
i = (int) Math.Round(x / y); // Line replaced
【讨论】:
【参考方案8】:没有一个代码示例表现出学生所期望的正常行为(一半被四舍五入)。大多数人所期望的是:
double d = 1.5;
int i = (int)Math.Round(d, MidpointRounding.AwayFromZero);
【讨论】:
【参考方案9】:int myInt = (int)Math.Ceiling(myDouble);
【讨论】:
【参考方案10】:我认为最好的方法是Convert.ToInt32
。
【讨论】:
【参考方案11】:label8.Text = "" + years.ToString("00") + " years";
当您想将其发送到标签或其他东西,并且您不想要任何小数部分时,这是最好的方法
label8.Text = "" + years.ToString("00.00") + " years";
如果你只想要 2 个,它总是这样
【讨论】:
这肯定是不是最好的方法,你可能应该收回你的答案。通过使用ToString
,您在幕后更新了许多其他昂贵的资源,例如用于特殊目的的字符串格式化程序和解析器。从这里给出的答案中学习。最接近的最佳方法是转换为 int
并截断小数部分或使用 Math.Round
之类的东西来获得您正在寻找的最接近的 int
。以上是关于将 double 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章