Я только начал писать солидность и заметил, что нет десятичных значений, таких как double или float.
Что вы, ребята, делаете, когда вам нужно отправить обратно на кошелек, скажем, 1,57 эфира? Или когда нужно вычислить 1/2 = 0,5?
Я очень запутался - я пытался сделать что-то вроде, var a = 0.5;
но выдает ошибку, которая говорит
Недопустимое буквальное значение.
Математика в 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;
Стоит также отметить, что плавающая запятая для финансовой математики — ужасная идея — она вносит ошибки округления, которые легко приводят к потере денег.
В документации по номерам с фиксированной точкой есть предупреждение, в котором говорится:
Числа с фиксированной точкой еще не полностью поддерживаются 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 двоичных разряда после точки) и выполняет все основные математические операции.
Пол Разван Берг