En Solidity, quiero verificar que el numerador y el denominador pasados a mi función evalúen 0% < num / denom < 100%.
Intenté el enfoque más directo: num / denom > 0 && num / denom < 1
pero, por ejemplo, 1% ( 1 / 100 > 0 && 1 / 100 < 1
) se evalúa como falso, porque Solidity no tiene decimales.
Mi otra idea es num > 0 && num < denom
. ¿Se puede demostrar formalmente que eso es siempre lo mismo que 0% < num / denom < 100%?
Si no está preocupado por los casos exactamente 0% y exactamente 100% (o alternativamente, los casos num == 0
y num == denom
), entonces sí, num > 0 && num < denom
es correcto (con un denom > 1
, de todos modos implícito).
La prueba es bastante simple: 0 < num / denom < 1
se puede reescribir como 0 * denom < num < 1 * denom
, lo que se reduce a 0 < num < denom
. Esto se puede reescribir como 0 < num && num < denom
, que es equivalente anum > 0 && num < denom
Tenga cuidado con estas cosas: el significado matemático de "0 < num / denom < 1", en el sentido de números racionales o reales, es diferente del significado en lenguajes de programación que tratan con números enteros como Solidity.
Por ejemplo, si num es 1 y denom es 2, entonces num / denom será 0 en Solidity pero 0,5 en el sentido matemático y, por lo tanto, mayor que cero.
En resumen: "num > 0 && num < denom" no es la verificación correcta en Solidity, pero todo depende de lo que hagas con esto después.
Richard Horrocks