将浮点数转换为整数

37

我正在进行一个项目,目前遇到了如下错误:

无法将类型“float”隐式转换为“int”。

我有一定的理解,只是需要帮助将我的浮点数转换为整型。

这只是其中一个浮点数的例子:

float key = 0.5f;
int key = 53;

这是具体的代码部分:

// price in scrap, e.g. 29 / 9 = 3.33 ref
static int BuyPricePerTOD = 21;
// price in scrap, e.g. 31 / 9 = 3.55 ref
static float SellPricePerTOD = BuyPricePerTOD + 0.5F;

static int BuyPricePerKey = 53;
static float SellPricePerKey = BuyPricePerKey + 0.5F;

static int TimerInterval = 170000;
static int InviteTimerInterval = 2000;

int UserWeapAdded,UserScrapAdded,UserRecAdded,UserRefAdded,
    UserKeysAdded,UserTODAdded,BotTODsAdded,BotKeysAdded,
    BotScrapAdded,BotRecAdded,BotRefAdded,InventoryMetal,
    InventoryScrap,InventoryRec,InventoryRef,InventoryKeys,
    InventoryTOD,PreviousTODs,PreviousKeys,WhileLoop,InvalidItem = 0;

float UserMetalAdded, BotMetalAdded, OverpayNumKeys,
    OverpayNumTOD, ExcessInScrapKey, ExcessInScrapTOD = 0.0F;
double ExcessRefinedKey, ExcessRefinedTOD = 0.0;

1
你能展示一下你已经编写的代码吗? - Edper
3
int _value = Convert.ToInt32(key); 将key转换为整数类型并赋值给_value。 - Revan
2
你想四舍五入吗?还是只想截断?例如,1.8 四舍五入后是 2,但截断后是 1 - Matt Burland
1
@user3325320,int类型无法存储小数值,因此被称为整数 - pcnThird
@user3325320,你链接的代码将0.5添加到金额中,末尾的"f"表示它是一个浮点数。如果你从整数53开始,然后加上一半(=53.5),你需要将它存储为具有小数位数的东西(例如float、double或decimal)。如果你“只想摆脱浮点数”,那么删除添加到价格的代码即可。如果你不喜欢在值后面加上“f”,那么使用double,它会愉快地执行53 + 0.5。 - SeeMoreGain
显示剩余3条评论
2个回答

61

首先,有整数浮点数。整数始终是整数,例如01-32421337。而浮点数可以有小数部分: 01-32.142.7123.456788都是有效的浮点数。

在整数(int)和浮点数(float)之间进行转换时,可以这样做:

int someInt = 42;
float someFloat = someInt;  // 42.0f

但你不能做这个:

float someFloat = 42.7f;
int someInt = someFloat;    // ?

第一个转换可以实现的原因是将整数 (int) 转换为浮点数 (float) 不会改变这个数字。这是一种安全的转换,因此可以 隐式 地完成。

第二个转换不允许的原因是将带有小数部分的浮点数转换为没有小数部分的整数必须舍弃数字的小数部分,即它变成了另一个数字。这是不安全的,因此只能 显式 完成。


要显式地将一种数字类型转换为另一种类型,您可以使用 强制类型转换。就是在想要转换为的数字类型前面加上括号。

float someFloat = 42.7f;
int someInt = (int)someFloat;               // 42

请注意浮点数的小数部分已被删除,就好像它已向零舍入。如果您想将浮点数四舍五入到最接近的整数,请使用Math.Round方法

float someFloat = 42.7f;
int someInt = (int)Math.Round(someFloat);   // 43

8
“向零舍入”是一个矛盾修饰语。我的意思是这不是同一件事情。你的解释含糊不清,因为“向下舍入”和“向零舍入”对于负数来说是相反的方向。对于正数来说,它们是相同的。 - Shawn Kovac

12

试试这个:

int numInt = (int)Math.Ceiling(numFloat);

msdn文档

顺便说一下,你可能想要使用Math.Round()或者Math.Floor()

例子:

float numFloat = 1.5f;
int testCeiling = (int)Math.Ceiling(numFloat);
int testFloor = (int)Math.Floor(numFloat);
int testRound = (int)Math.Round(numFloat);

Console.WriteLine("testCeiling = {0}", testCeiling.ToString());
Console.WriteLine("testFloor = {0}", testFloor.ToString());
Console.WriteLine("testRound= {0}", testRound.ToString());

输出:

testCeiling = 2
testFloor = 1
testRound= 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接