Используйте Decimalвместо ffGeneral.
18игнорирует Decimalпараметр.
Когда вы используете 2, ffFixedвы говорите, что хотите 18 значащих десятичных цифр. Затем подпрограмма выражает это число кратчайшим образом, используя научную нотацию, если это необходимо. Это 2игнорируется.
Когда вы используете 2, вы говорите, что вам нужны 2цифры после десятичной точки.
Если вам интересно, почему вы иногда получаете значения, которые кажутся неточными, на этом сайте можно найти много других, и другие объяснят, как работают числа с плавающей запятой.
В этом случае AsFloatвозвращается a double, который, как (большинство) других форматов с плавающей запятой, сохраняет свое значение в двоичном формате. Точно так же, как 1/3 не может быть записано в десятичной форме с конечными цифрами, ни 15.6 не могут быть представлены в двоичном виде в конечном числе бит. Система выбирает максимально возможное значение, которое может быть сохранено в a double. Точное значение в десятичной форме:
15,5999999999999996447286321199499070644378662109375
Если бы вы запросили 16 цифр точности, значение было бы округлено до 15.6. Но вы просили 18 цифр, так что вы получите 15.5999999999999996.