将float转换为int截断休息,似乎不可靠

时间:2013-11-14 09:45:29

标签: python c++ casting floating-point

看到这样的事情感到很惊讶:

float f = 10.25f;
int i = (int)f;
// Will give you i = 10

收益是多少?

OTOH 10.25与10完全不同,这将是一致的,这种软转换可能会发生不好的事情。

哪种语言会引发错误?

期待有些像:"Error: Can't represent 10.25 as an integer"

同时给出答案的WRT:是的,它可能被认为是像“圆形”这样的函数的可靠方式。但不是直接WRT来预测数据/信息的完整性。

也许一个默认为“int”行为的函数“truncate”会有更好的选择吗?

4 个答案:

答案 0 :(得分:3)

正是

(int)f

表示程序员知道他在做什么,而在大多数编程语言中禁止以小数部分静默切除并将其余部分存储在整数中。

顺便说一句,不仅仅是小部分被切断了。浮点数也可以具有如此大的值,以至于它不可能表示为int。考虑:

(int) 1e20f

答案 1 :(得分:2)

声明int i = (int)f;明确说明“请将我的浮动f并将其设为int”。这当然是我经常发现有用的事情 - 为什么你不想将浮点值从某种计算转换为整数?强制转换(int)将告诉编译器“我真的希望这是一个整数”,就像在C中你可以做char *p = (char *)1234567; - 有一个类型转换告诉编译器“我真的知道我是什么“干嘛”。

如果你执行int i = f;int i = 10.25;,编译器仍然会执行“请求”的操作 - 将浮点值转换为整数。如果您启用相应的警告,它可能会发出警告,说“您正在将float转换为int”。

C和C ++是需要你理解你在做什么的语言,以及后果是什么 - 其他一些语言为防止这些事情设置了更多的“障碍”,但这通常意味着编译器必须增加额外的用于在运行时检查内容的代码 - C和C ++被设计为“快速”语言。

这有点像驾驶汽车,当后面有一堵墙时将汽车反转,踩油门,可能会导致汽车撞到墙上 - 如果这不是你想要的那么,那么“不这样做“。

答案 2 :(得分:1)

首先,转换绝对是"可靠",因为"它总会做同样的事情"。

您是否愿意这样做取决于您。通常,C / C ++语言旨在为程序员提供大量低级功能,这意味着程序员需要知道他们正在做什么。如果float-to-int转换让你感到惊讶,那么你需要更加努力。

事实上,GCC有一个选项-Wconversion,可以突出显示这样的情况。默认情况下,它不会启用,并且不属于-Wall-Wextra(可能是因为行为已被很好地理解,并且#34;预期"大多数程序员),但是如果你需要,可以选择。

除非它不会发出警告,在这种情况下,因为您的代码包含显式强制转换(int),因此编译器假定您是故意这样做的。

这会发出警告(-Wconversion):

int i = f;

这不是:

int i = (int)f;

答案 3 :(得分:1)

在处理复杂数据的情况下,转换为整数很有用,但最终需要将此数据转换为int以对其执行某些操作。想想数组中的偏移或屏幕上的像素

想想在屏幕上画一个圆圈。不存在像素的一小部分(因此坐标是整数),但是你不能用int来计算像素的坐标(sin与pi和其他浮点一起工作)。