I hope this question is not asked, but i googled too much and tried to find out the problem my self.
I'm trying to get a dynamic percentage using SafeMath
uint256 lowNumber = 316442921;
uint256 highNumber = 632885842;
uint256 distanceFromHigherNumber = 544386085;
In daily math i found a way to calculate that but it won't work here.
result = ((distanceFromHigherNumber - lowNumber) / (highNumber - lowNumber)) * 100;
percentage = 100 - result // in percentage should be ~ 28%
In solidity i did it this way:
uint256 result = (distanceFromHigherNumber.sub(lowNumber) / highNumber.sub(lowNumber)) * 100;
uint256 percentage = 100 - result;
It returns always 100, i guess it is maybe returning 1 instead of 0.72 and when i'm multiplying it by 100, when i play around it a little bit i get only zero or 100.
Any help please, i'm too new to solidity.
Best Answer
Solidity has no concept of floating-point numbers, so you need to work on an integer representation of your number.
Your idea is good, but the order of operations won't work on integers.
Will always return a number between 0 and 1 by definition (unless you allow
x < low
orx > high
but it wouldn't make any sense). Solidity only deals with integers, so it will return either 0 or 1, nothing in between. When you multiply this value by 100, you get either 0 or 100...You need to multiply before doing the division, to immediately generate a number between 0 and 100 (or more depending on the precision that you are looking for).
This code returns the percentage that you are looking for when given
544386085
as parameter :72
.Btw, SafeMath is superfluous here, since if you know that
x >= low
andx <= high
(due to the require statements) there is no overflow / undeflow possible.