note
syphilis
<I>It prints "Number is: 196, Integer part is: 195", but I would expect $x2 to be 196</I><br><br>
Your expectation is unreasonable. (I know ... it seems like a reasonable expectation ... but it is not.)
<br><br>First of all, note that <c>(1.15*170)+0.50</c> cannot be exactly represented in a double.
<br>This is mainly due to the fact that 1.15 cannot be exactly represented in a double.
<br>When you assign a value of 1.15 to a double you are actually assigning the precise value 1.149999999999999911182158029987476766109466552734375.
<br>And the expression <c>(1.15*150)+0.50</c> evaluates to exactly 195.999999999999971578290569595992565155029296875.
<br><br>Perl's print() function takes the action of rounding that value to 15 decimal digits. It does that for all floating point values - always to 15 decimal digits (unless perl's nvtype is other than "double") and always for a dubious reason.
<br><br>So ... quite clearly, the integer portion of 195.999999999999971578290569595992565155029296875 is 195, and 195.999999999999971578290569595992565155029296875 rounded to 15 decimal places is 196.
<br>And this agrees with the results that you obtained.
<br><br>It leaves shaking my head in disbelief, too ... but that's the stupid way that perl's print() function has been doing it for a long time and, unfortunately, I can't see it doing anything differently any time soon.
<br> A far saner approach would be for perl's print() function to have displayed the value <c>195.99999999999997</c> as happens with python3 and raku.
<br> Note that, although you have questioned the printed value of $x2, it's actually the printed value of $x1 that's misleading.
<br><br>Cheers,<br>Rob
11123116
11123116