【发布时间】:2013-01-31 04:00:51
【问题描述】:
我有以下代码行。
hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0 - hero->getDefensePercent()));
-
void onBeingHit(int decHP)方法接受整数并更新健康点。 -
float getDefensePercent()方法是一个 getter 方法,返回英雄的防御百分比。 -
ENEMY_ATTACK_POINT是一个宏常数因子,定义为#define ENEMY_ATTACK_POINT 20。
假设hero->getDefensePercent() 返回0.1。所以计算是
20 * (1.0 - 0.1) = 20 * (0.9) = 18
每当我尝试使用以下代码时(没有f 附加1.0)
hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0 - hero->getDefensePercent()));
我得到了 17。
但是对于下面的代码(f 附加在1.0 之后)
hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0f - hero->getDefensePercent()));
我得到了 18。
发生了什么事?尽管hero->getDefensePercent() 已经处于浮动状态,但f 是否重要?
【问题讨论】:
-
您无法准确保存
.9或.1(使用浮点数据类型)。双精度中较低的精度可能会导致类似18.00x而不是17.999xxx。请注意,floating point --> int始终处于倒置状态。 -
不太了解 C++,但我希望您的文字被解释为
double,从而强制在doubles 而不是floats 中完成计算。 -
ENEMY_ATTACK_POINT是一个整数。由于您使用的是整数数学,因此您会遇到舍入错误。
标签: c++ floating-point double floating-accuracy