воскресенье, 3 ноября 2019 г.

double

https://docs.microsoft.com/ru-ru/dotnet/api/system.single?view=netframework-4.8#testing-for-equality

Самые ходовае int и double.
Сравнить можно 2 способами, через «эпсилон» и приведением к int.
Например,
1)
double a=100,219999999999999999;
double b=100,220000000000000001;
double c=0,0001; //любая нужная точность
if(fabs(a-b)<c) {} //если равны, то ...

2)
int a=int(100,219999999999999999*100+0,01);
int b=int(100,220000000000000001*100+0,01);
if(a==b) {} //если равны, то…

Напрямую сравнивать на  = вещественные числа неправильно. Должно быть так:
f_eps = 0.000001
abs(c.low-unit.t.y)<f_eps
И да, нет смысла переходить с float(или double) на decimal.

Есть стандарты MISRA и CERT по надёжному программированию. Тупое следование их рекомендациям уберет 99% потенциальных ошибок.

https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%8D%D1%85%D1%8D%D0%BD%D0%B0

Попробуй в отладчике на вкладке «Контрольные значения» написать:
c.low.ToString(«F10») и unit.r.y.ToString(«F10»)

Увидишь значения не с двумя знаками после запятой, а с 10. Может оно действительно меньше при использовании float.

Можешь попробовать использовать double. Он использует 64 бита на число(у float 32 бита).

Выше рекомендовали адаптировать сравнение:
вместо «c.low <= unit.r.y» использовать «c.low <= unit.r.y + Epsilon», где Epsilon константное значение, заданное тобой. Выбирается исходя из того, какая точность тебя устраивает. Если цена в долларах(т.е. 59.15 — это $59.15), то можешь попробовать Epsilon = 0.001d.


Комментариев нет:

Отправить комментарий