From: "Eustáquio Rangel" Date: 2021-06-16T09:24:39-03:00 Subject: [ruby-core:104307] Float truncate --===============0660263922== Content-Type: multipart/alternative; boundary="00000000000053755905c4e12d05" --00000000000053755905c4e12d05 Content-Type: text/plain; charset="UTF-8" Hi! A customer just noticed a weird behaviour on its app, regarding float truncate. I know floats are wild beasts and we can have some surprises as stated on the truncate docs as (0.3 / 0.1).truncate => 2 But let me show what they found: > 291.1.truncate(2) => 291.1 > 291.2.truncate(2) => 291.2 > 291.3.truncate(2) => 291.3 > 291.4.truncate(2) => 291.39 <------------------ here! > 291.5.truncate(2) => 291.5 Notice 291.4 truncating to 2, returns 291.39! They have another number like .3 that truncates to .2, so I just took a look on rb_float_floor and found that 291.4 is converted to 29139.000000 after powered and sent to floor(number * f) and then proceeds to DBL2NUM when it returns 291.39. I advised them to use another approach other than truncate (round don't work for them because of the ceil/floor operation) but I'm curious if it is a known behaviour of float truncate. Thanks. --00000000000053755905c4e12d05 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi!=

A customer just noticed = a weird behaviour on its app, regarding float truncate. I know floats are w= ild beasts and we can have some surprises as stated on the truncate docs as=

(0.3 / 0.1).truncate =C2=A0
=3D> 2<= /font>

But let me show wh= at they found:

> 291.1.truncate(2)
=C2=A0=3D= > 291.1
> 291.2.truncate(2)
=C2=A0=3D> 291.2
> 291.3= .truncate(2)
=C2=A0=3D> 291.3
> 291.4.truncate(2)
=C2=A0=3D= > 291.39 <------------------ here!
> 291.5.truncate(2)
=C2= =A0=3D> 291.5=C2=A0


Notice 291.4 truncating to 2, returns 2= 91.39! They have another number like .3 that truncates to .2, so I just too= k a look on=C2=A0rb_float_floor and found that 291.4 is converted to=C2=A02= 9139.000000 after powered and sent to

floor(number * f)=

and then proceeds to DBL2NUM when it returns 291.39. I= advised them to use another approach other than truncate (round don't = work for them because of the ceil/floor operation) but I'm curious if i= t is a known behaviour of float truncate.

Thanks.

--00000000000053755905c4e12d05-- --===============0660263922== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Unsubscribe: --===============0660263922==--