Vb.net 将'Double'或'Single'转换为'Integer'的最干净的方法,无需舍入
使用或Vb.net 将'Double'或'Single'转换为'Integer'的最干净的方法,无需舍入,vb.net,floating-point,type-conversion,Vb.net,Floating Point,Type Conversion,使用或CType将浮点数转换为整数将导致该数字的值被舍入。Int函数和Math.Floor可用于将浮点数转换为整数,并向负无穷大舍入,但这两个函数都返回浮点值,在没有强制转换的情况下不能隐式用作Integer值 对于IntVar=CInt(Int(FloatingPointVar)),是否有一种简洁且惯用的替代方法?Pascal包括返回整数的Round和Trunc函数;在VB.NET语言或.NET框架中是否有一些等价物 2011年有人问了一个类似的问题,但它只是问是否有办法将浮点数转换成整数;答
CType
将浮点数转换为整数将导致该数字的值被舍入。Int
函数和Math.Floor
可用于将浮点数转换为整数,并向负无穷大舍入,但这两个函数都返回浮点值,在没有强制转换的情况下不能隐式用作Integer
值
对于IntVar=CInt(Int(FloatingPointVar)),是否有一种简洁且惯用的替代方法代码>?Pascal包括返回整数的Round
和Trunc
函数;在VB.NET语言或.NET框架中是否有一些等价物
2011年有人问了一个类似的问题,但它只是问是否有办法将浮点数转换成整数;答案建议分两步进行,但没有深入讨论框架中存在或不存在的内容。我很难相信该框架不会有类似于Trunc
函数的东西,因为在使用浮点操作数执行图形操作时经常需要这样的东西[此类操作需要渲染为离散像素,并且应该以舍入(x)的方式进行舍入]-1=适用于+/-(2^31-1)范围内的所有x的四舍五入(x-1);即使这些操作是四舍五入的,也应使用地板(x+0.5),而不是四舍五入到最接近的偶数,以确保上述特性]
顺便说一句,在C#中,使用(type)expr
表示法从Double
到Int
的类型转换使用了从四舍五入到零的语义;这与VB.NET行为不同的事实表明,一种或两种语言使用自己的转换例程,而不是框架中包含的显式转换运算符。框架似乎应该定义一个转换操作符?框架中是否存在这样一个操作符?它有什么作用?有没有办法从C#和/或VB.NET调用它?您可能需要提取浮点数的Int部分:
float num = 12.234;
string toint = "" + num;
string auxil = toint.Split('.');
int newnum = Int.Parse(auxil[0]);
经过一番搜索,似乎VB除了编写一个扩展方法之外,没有一个干净的方法来实现这一点
C#(int)
cast直接转换为IL中的conv.i4
,而且似乎没有任何框架功能提供替代方案
–当然,从那以后发生了很多变化,但我认为这种情况仍然存在。你可以使用这种方法
计算指定的双精度浮点数的整数部分
例如:
Dim a As double = 1.6666666
Dim b As Integer = Math.Truncate(a) ' b = 1
我知道这是一个古老的例子,但我看到没有人建议使用Math.Round()函数
是的,数学。轮取一个双精度,返回一个双精度。但是,它返回一个已四舍五入为整数的数字。它应该使用cInt轻松简洁地转换为整数。这样就够了吗
cInt(数学四舍五入(10000.54564))'=10001
cInt(math.round(10000.49564))'=10000请不要。不要通过将数字转换为字符串并返回来执行算术运算。这是低效的、不必要的和逻辑上复杂的。这与“最干净的转换方式…”如何兼容?可能是最差和最低效的方式。不回答你的问题,只是出于好奇:使用另一种舍入方法,即银行家舍入法。@KonradRudolph:谢谢你提供这种转换方法;不幸的是,这与CInt
使用的方法是一样的,不过对于用C#编写的代码来说,这可能会有所帮助。啊,我认为(没有检查)CInt
是四舍五入到零,而不是截断或四舍五入到偶数。不管怎样,就像我说的,这不是答案。我想不出用VB一步就能实现C#的(int)
转换的任何方法(这并不意味着没有办法)。@KonradRudolph:实际上,我想要的是圆到负无穷大。使用舍入到零的图形例程通常在零处有一个可见的异常,而使用舍入到零的图形例程有时每两个像素就有一个异常(因为舍入时序列(0.5 1.5 2.5 3.5)变为(0 2 4).Round to negative infinity显然在许多情况下都很有用;我想知道各种图形例程是否使用它们自己的内部方法,或者它们是做什么的?Math.Truncate
生成类型为Double
的结果;如果没有选项Strict Off
,上述函数将无法编译。Int
函数将生成所需的数值erical行为,如果我想使用Option Strict Off
,那就没问题了,但这种设置使vb.net成为一种非常古怪的语言。你说得很对,Option Strict Off不好。我没有注意到我的VS auto在创建控制台应用程序时会这样做(否则我会看到警告)。我想知道为什么微软不会一直在vb或框架中添加一些方法[就这一点而言,图形例程是如何处理这个问题的]?这并不是说从浮点值到整数值的非舍入转换就是一个模糊的操作。他们使用Fix()来做函数。下面是我的答案。@Undefined No。我的答案中的链接已经提到了Fix
,但也提到了为什么它不能满足OP的要求。简而言之,Fix
返回了错误的类型,你仍然需要转换为Integer
,与问题中提到的函数一样。强制转换不是OP的问题,rounding是OP的问题。Fix返回一个double,但它是一个整数,没有舍入。本质上是一个整数。@未定义这是胡说八道。OP想要的是CInt(Int(x))
(而不是CInt(Fix))
!),但更简洁。演员阵容绝对是问题的一部分。OP在问题中明确地说了这一点,并再次在你回答下面的评论中这样说。