Округление чисел типа double

 

Всем привет! подскажите знающие люди, вот в чем:

Есть число: 0.810000000000001 (может быть любым в принципе), как округлить ее до 0.81?

Или например: 123.922000011 округлить до 123.93?

 
Vasily Pererva:

Всем привет! подскажите знающие люди, вот в чем:

Есть число: 0.810000000000001 (может быть любым в принципе), как округлить ее до 0.81?

Или например: 123.922000011 округлить до 123.93?


NormalizeDouble(число типа double, точность округления)?
 
Vitalii Ananev:

NormalizeDouble()?

не помогает, после него как раз и получается такое число, иногда нормально а иногда выдает километр после точки хотя у меня стоит NormalizeDouble(double_val,2)
 
Vasily Pererva:

не помогает, после него как раз и получается такое число, иногда нормально а иногда выдает километр после точки хотя у меня стоит NormalizeDouble(double_val,2)

Это да тоже замечал за ним такой грешок, но эксперт вроде работает торговые приказы отправляются по этому игнорировал этот баг и над альтернативой не думал.
 
Vasily Pererva:

не помогает, после него как раз и получается такое число, иногда нормально а иногда выдает километр после точки хотя у меня стоит NormalizeDouble(double_val,2)

Получается, но увидеть его нельзя. Можете убедиться, что число без хвоста как нибудь так - if(x==123.93)Alert("ok")
 
Dmitry Fedoseev:

Получается, но увидеть его нельзя. Можете убедиться, что число без хвоста как нибудь так - if(x==123.93)Alert("ok")

Можно увидеть если преобразовать в текст. Именно так я и заметил, что после нормализации в конце дробного числа проскакивает единичка. например 1.122340000001 потом на следующем тике может нормально показать 1.12234.
 
Vitalii Ananev:

Можно увидеть если преобразовать в текст. Именно так я и заметил, что после нормализации в конце дробного числа проскакивает единичка. например 1.122340000001 потом на следующем тике может нормально показать 1.12234.


Тут нет уверенность, от нормализации ли нет хвоста или от преобразования в строку.

Надо один раз поэкспериментировать с if, убедиться, что NormalizeDouble() работает правильно, а потом использовать DoubleToString() для вывода.  

 
Dmitry Fedoseev:


Тут нет уверенность, от нормализации ли нет хвоста или от преобразования в строку.

Надо один раз поэкспериментировать с if, убедиться, что NormalizeDouble() работает правильно, а потом использовать DoubleToString() для вывода.  


Это да согласен. Я не проверял в результате нормализации или в результате преобразования единица появляется.
 
Vitalii Ananev:

Это да согласен. Я не проверял в результате нормализации или в результате преобразования единица появляется.


Просто от вывода появляется. Единственно правильный вывод с предварительным DoubleToString()

Число может быть нормализованным без хвоста, в этом можно убедиться через if(), а если его вывести через алерт или принт, появляется хвост.  

 
Dmitry Fedoseev:


Просто от вывода появляется. Единственно правильный вывод с предварительным DoubleToString(). 

Число может быть нормализованным без хвоста, в этом можно убедиться через if(), а если его вывести через алерт или принт, появляется хвост.  


да, все верно, проверил, хвост только на принте. в общем для принта стал использовать DoubleToString и все стало гуд. спасибо всем!
 
при передаче переменной double в любую функцию / метод класса, по значению, происходит по сути создание копии переменной типа double со всеми вытекающими последствиями, это особенность работы с вещественными числами двойной точности...
Причина обращения: