M4trix Dev
M4trix Dev

Reputation: 2284

Why multiply two double in dart result in very strange number

Can anyone explain why the result is 252.99999999999997 and not 253? What should be used instead to get 253?

double x = 2.11;
double y = 0.42;
print(((x + y) * 100)); // print 252.99999999999997

I am basically trying to convert a currency value with 2 decimal (ie £2.11) into pence/cent (ie 211p) Thanks

Upvotes: 4

Views: 2328

Answers (1)

lrn
lrn

Reputation: 71813

In short: Because many fractional double values are not precise, and adding imprecise values can give even more imprecise results. That's an inherent property of IEEE-754 floating point numbers, which is what Dart (and most other languages and the CPUs running them) are working with.

Neither of the rational numbers 2.11 and 0.42 are precisely representable as a double value. When you write 2.11 as source code, the meaning of that is the actual double values that is closest to the mathematical number 2.11.

The value of 2.11 is precisely 2.109999999999999875655021241982467472553253173828125. The value of 0.42 is precisely 0.419999999999999984456877655247808434069156646728515625. As you can see, both are slightly smaller than the value you intended.

Then you add those two values, which gives the precise double result 2.529999999999999804600747665972448885440826416015625. This loses a few of the last digits of the 0.42 to rounding, and since both were already smaller than 2.11 and 0.42, the result is now even more smaller than 2.53. Finally you multiply that by 100, which gives the precise result 252.999999999999971578290569595992565155029296875.

This is different from the double value 253.0.

The double.toString method doesn't return a string of the exact value, but it does return different strings for different values, and since the value is different from 253.0, it must return a different string. It then returns a string of the shortest number which is still closer to the result than to the next adjacent double value, and that is the string you see.

Upvotes: 6

Related Questions