Добрый день! подскажите что с этим делать. Банальная операция
d = 73367.48 - 56228.55;
var f = 17138.93;
var c = d - f;
Log.Write(1,c);
Результат
-7.27595761418343E-12
Хотя по логике должен быть 0
Нравится
Попробуйте так:
var d = 0 ; d = 73367.48 - 56228.55; var f = 17138.93; var c = 0; с = d - f; Log.Write(1,c);
Олег как бы я не изменял значение f результат 0 в любом случае
Это обусловлено внутренним форматом хранения вещественных чисел, не в Террасофт, а вообще в компьютерах.
Например, подобное условие тоже не всегда может быть истинным:
if ((24.35 - 12.15 - 12.20) == 0.0)
В вашем случае, я бы попробовал воспользоваться дополнительно округлением до 2-х знаков.
Также почитайте эту тему:
http://www.community.terrasoft.ua/blogs/4080
я немного извратился и сделал вот так
var x = new Number(Dataset.Values('CashflowAnount') - Dataset.Values('InvoiceAmount')); var g = new Number(Dataset.Values('Dolg')); var h = new Number(Number(x.toFixed(2))+g); Dataset.Values('Balance') = h.toFixed(2);
Может ли быть случай когда подсчет будет неверен?
при работе с вещественными числами с плавающей запятой (типы float,real,double,extended) более высокая ошибка округления, чем с вещественными числами с фиксированной запятой (decimal,fixed).
-7.27595761418343E-12 - это почти ноль, а для 0 в таких типах данных есть специальный код
Вы можете сделать величину погрешности eps = 0.00000001 и проверять, не превышает ли её значение, или делать округление до соответствующей цифры перед записью результата