Problem
as title mentioned, when use math.floor()
on 21000*0.7
and 14700.0
the returned value is different.
math.floor(21000*0.7)
returns 14699
, but math.floor(14700.0)
returns 14700
.
Lua versions
5.3.x and 5.4.x
as title mentioned, when use math.floor()
on 21000*0.7
and 14700.0
the returned value is different.
math.floor(21000*0.7)
returns 14699
, but math.floor(14700.0)
returns 14700
.
5.3.x and 5.4.x
The behavior you're getting is because of floating point inaccuracies. See this question for more details, but in a nutshell, the reason is similar to why we can't represent 1 / 3
(0.33 repeating) with a finite amount of digits in decimal.
You can test it yourself! Use formatting to get a more precise string representation, and print it:
print(("%.14f"):format(21000*0.7))
Prints 14699.99999999999818
!
Lua tostring
doesn't have this precision. Some dialects change that because like in your case, it can be confusing. This is also why 0.1 + 0.2 == 0.3
evaluates to false
, but printing both expressions individually prints 0.3
.
The solution is to do it this way: 21000 * 7 / 10
, assuming that 21000 will be replaced by a variable. If the entire fraction will be unknown, and if 21000 will be replaced by an integer, then you can try doing this: 21000 * 0.7 + 0.1
(as the argument of floor
)