## Is 230 % 5 == 4? Sometimes it is.

I don't want to give this away in this post, but see if you can suss out this problem:

```
my $value = 200 * 1.15; # 230
print "Value is [$value]\n"; # Value is [230]
my $result = $value % 5; # 4
```

When you give up, read my answer on O'Reilly Answers.

The actual value of $value isn't integer 230 but a floating point number like 229.99. Stringification rounds off the $value slightly (is that documented anywhere?). The modulus operator is an integer operator and thus converts $value to the integer 229 (I wouldn't mind that giving a warning), hence the result 4.

Lesson of the day: don't mix floating points and integer operations.

Output in Perl 6: 0.

The reason is that 1.25 is represented as a rational number with integer numerator and denominator, so the identity 200 * 1.15 == 230 actually holds.

Put another way:

15:47 <@pmichaud> I'd simply say that Perl 6 knows how to represent 1.15 exactly. :-)

I was figuring that Perl 6 would be more like Smalltalk and have rationals. :) I hope it's really, really fast though. I saw one Smalltalk application that got pretty slow as it was making ever bigger and bigger denominators. Slow and correct is better than fast and wrong, but there's a limit to how correct I really need. :)

There's a whole field of study called Numerical Analysis that deals with problems like this. Or as a colleague of mine once said: 1 + 1 = 3, with rounding.