Как я могу представить десятичные значения в Solidity?

Я только начал писать солидность и заметил, что нет десятичных значений, таких как double или float.

Что вы, ребята, делаете, когда вам нужно отправить обратно на кошелек, скажем, 1,57 эфира? Или когда нужно вычислить 1/2 = 0,5?

Я очень запутался - я пытался сделать что-то вроде, var a = 0.5;но выдает ошибку, которая говорит

Недопустимое буквальное значение.

Ответы (4)

Математика в Solidity полностью выполняется с фиксированной точкой. Для эфира нет необходимости использовать дробные значения — все значения представлены в вэй, которая является наименьшей единицей эфира.

Если вы хотите отправить 0,5 эфира, вы можете вместо этого указать свой литерал как «500 finney», который будет конвертирован в wei:

msg.sender.send(500 finney);

или же:

msg.sender.send(1 ether / 2);

которые оба точно эквивалентны:

msg.sender.send(500000000000000000);

Если вы хотите умножить значение на дробь (например, 2/3), сначала умножьте на числитель, а затем разделите на знаменатель:

value = (value * 2) / 3;

Стоит также отметить, что плавающая запятая для финансовой математики — ужасная идея — она вносит ошибки округления, которые легко приводят к потере денег.

@NickJohnson Позвольте мне спросить вас еще об одном. Итак, когда кошелек отправляет средства на контракт, если я вызываю функцию msg.value? Это вернет мне количество эфира, представленное в wei, верно? То есть по умолчанию в договоре я всегда говорю о вей?
@sfrj Верно.

В документации по номерам с фиксированной точкой есть предупреждение, в котором говорится:

Числа с фиксированной точкой еще не полностью поддерживаются Solidity. Они могут быть объявлены, но не могут быть назначены или из.

Предупреждение в нижней части Rational and Integer Literals гласит:

Деление на целочисленные литералы использовалось для усечения в более ранних версиях, но теперь оно будет преобразовано в рациональное число, т.е. 5/2 равно не 2, а 2,5

Итак, что вы можете сделать с ними, если они не могут быть назначены на или из?

В документации Solidity упоминается Reals как тип значения.

Редактировать: на самом деле это была старая документация на Github. Нет упоминания в документации ReadTheDocs.

Вещественные числа формируются аналогично целым числам, за исключением того, что они включают десятичную точку и по крайней мере одно число по обе стороны от нее. Например: 3.14159265 и 42.000001.

Я получаю ошибки компилятора при попытке использовать их, поэтому они могут быть еще не реализованы.

Фиксированная точка/рациональные числа вернулись .

Обратите внимание, что в Эфириуме 1.57 ETHвсе количества Эфира измеряются в Вэй, а 1 Эфир равен 10^18 Вэй, то 1.57 ETHесть в основном это 1570000000000000000 Weiцелое число.

Для 1/2 = 0.5вас, вероятно, нужна какая-то библиотека с фиксированной точкой, такая как ABDK Math 64.64 . Он работает с двоичными числами с фиксированной точкой (64 двоичных разряда после точки) и выполняет все основные математические операции.