On Wed, 04 Nov 2009 06:14:36 -0500, Joel Christensen <joel...@gmail.com>
wrote:
Input:
import std.stdio;
void main() {
float f=0.01;
writefln("%0.2f->%d",f,cast(int)(f*100f));
}
Output:
0.01->0
Comment:
What!?
hehe. .01 is not exactly represented by float, because it's stored as a
binary value, not a decimal value. Think about how there is no way to
represent 1/3 in decimal.
If you imagined that the computer stored things in decimal, see how the
1/3 example would work
a = 1.0/3; // truncated to 0.3333333
a *= 3; // 0.9999999
auto i = cast(int)a; // 0
This is analagous to what you are asking the compiler to do.
To be safe, whenever converting to int, always add a small epsilon. I
think you can use float.epsilon, but I don't have any experience with
whether that is always reasonable.
-Steve