Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将'Double'或'Single'转换为'Integer'的最干净的方法,无需舍入_Vb.net_Floating Point_Type Conversion - Fatal编程技术网

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在问题中明确地说了这一点,并再次在你回答下面的评论中这样说。