X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

Открыть тему
Тема закрыта
> сколько будет 0.7 + 0.1, редкое состояние растерянности
TAPAH
TAPAH
Topic Starter сообщение 9.5.2016, 13:52; Ответить: TAPAH
Сообщение #1


Новичок
*

Группа: User
Сообщений: 21
Регистрация: 1.2.2013
Поблагодарили: 1 раз
Репутация:   0  


Даже неловко задавать этот вопрос, но я давно не испытывал такого обескураживающего состояния!

Пишу на сайте такой код(php):

$qwas = 0.7;
$qwas = $qwas + 0.1;
print_r('1) qwas = '); print_r($qwas); print_r('<br>');
if($qwas == 0.8){print_r('2) qwas = 0.8<br>');}
if($qwas == (0.7 + 0.1)){print_r('3) qwas = (0.7 + 0.1)<br>');}

получаю такой результат:

1) qwas = 0.8
3) qwas = (0.7 + 0.1)

Полчаса его осмысливал, но не найдя какого-либо логического объяснения решил спросить у широкой общественности.
КАК ТАК?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
mmkulikov
mmkulikov
сообщение 9.5.2016, 14:07; Ответить: mmkulikov
Сообщение #2


Старожил
******

Группа: Active User
Сообщений: 2093
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 603 раза
Репутация:   70  


TAPAH, Да-с, любопытно...
Проблема в том, что $qwas - 0.8 не равно нулю :wacko:

Вот так, "чудеса" пропадают
Код
$qwas = round($qwas + 0.1, 2);


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
TAPAH
TAPAH
Topic Starter сообщение 9.5.2016, 14:17; Ответить: TAPAH
Сообщение #3


Новичок
*

Группа: User
Сообщений: 21
Регистрация: 1.2.2013
Поблагодарили: 1 раз
Репутация:   0  


mmkulikov, "чудеса" так не пропадают! Таким образом можно выкрутится из ситуации. Спасибо за участие! Я сам придумал способ как обойти это "чудо", но я не могу найти грамотное объяснение по какой причине (0.7 + 0.1) НЕ РАВНО 0.8
!!??
Или можно поставить вопрос так: чему же тогда равно $qwas - 0.8

Сообщение отредактировал TAPAH - 9.5.2016, 14:22
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
mmkulikov
mmkulikov
сообщение 9.5.2016, 14:25; Ответить: mmkulikov
Сообщение #4


Старожил
******

Группа: Active User
Сообщений: 2093
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 603 раза
Репутация:   70  


TAPAH, Потому, что вот:
Код
$qwas = 0.7;
$qwas = $qwas + 0.1;
var_dump($qwas - 0.8);


float(-1.1102230246252E-16)

РНР не одинок :D

Код
<!DOCTYPE html>
<html>
<body>

<script>
  var x = 0.3 - 0.2;
  var y = 0.2 - 0.1;

  document.write((x == y) + "<br>");    // false
  document.write((x == 0.1) + "<br>");  // false
  document.write(y == 0.1);             // true
</script>

</body>
</html>


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
TAPAH
TAPAH
Topic Starter сообщение 9.5.2016, 14:33; Ответить: TAPAH
Сообщение #5


Новичок
*

Группа: User
Сообщений: 21
Регистрация: 1.2.2013
Поблагодарили: 1 раз
Репутация:   0  


mmkulikov,
Код
$qwas = 0.7;
$qwas = $qwas + 0.1;
var_dump($qwas);
var_dump($qwas - 0.8);


float(0.8)
float(-1.11022302463E-16)

ЧТО тут происходит!?
У меня сейчас реально картина мира пошатнулась!!)))))

Сообщение отредактировал TAPAH - 9.5.2016, 14:35
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
mmkulikov
mmkulikov
сообщение 9.5.2016, 14:37; Ответить: mmkulikov
Сообщение #6


Старожил
******

Группа: Active User
Сообщений: 2093
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 603 раза
Репутация:   70  



Цитата(TAPAH @ 9.5.2016, 12:33) *
ЧТО тут происходит!?


Это называется точность представления числа float в двоичной системе (погрешность и была выведена вторым примером)
Для вычислений с float применяется правило: промежуточные вычисления идут с максимальной точностью, а результат округляется до нужной точности


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
TAPAH
TAPAH
Topic Starter сообщение 9.5.2016, 14:47; Ответить: TAPAH
Сообщение #7


Новичок
*

Группа: User
Сообщений: 21
Регистрация: 1.2.2013
Поблагодарили: 1 раз
Репутация:   0  


mmkulikov,
Хорошо. Исходим из этого. НО

Код
$qwas = 0.7;
$qwas = $qwas + 0.1;
var_dump($qwas);


float(0.8)

Почему тогда в самом первом примере условие if($qwas == 0.8) не срабатывает, а if($qwas == (0.7 + 0.1)) работает?

Сообщение отредактировал TAPAH - 9.5.2016, 14:48
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 9.5.2016, 15:10; Ответить: x64
Сообщение #8


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3521
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2858 раз
Репутация:   293  


Цитата(TAPAH @ 9.5.2016, 13:47) *
Почему тогда в самом первом примере условие if($qwas == 0.8) не срабатывает, а if($qwas == (0.7 + 0.1)) работает?

Очевидно потому, что (.7 + .1) != .8 :)
Код
var_dump( (int) ((.1+.7) * 10), (int) (.8 * 10) );
/*
int(7)
int(8)
*/

Почему так? Можете глянуть тут. Это не косяк пыха, это проблема представления нашей системы счисления в компьютерной (двоичной). Этот же «баг» воспроизводится на JS (выше подметили).


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
profican
profican
сообщение 9.5.2016, 19:44; Ответить: profican
Сообщение #9


Старожил
******

Группа: Active User
Сообщений: 1242
Регистрация: 30.6.2010
Поблагодарили: 294 раза
Репутация:   36  


Цитата
...проблема представления нашей системы счисления в компьютерной (двоичной).


Типов людей на Земле немного, всего 10.
Те, кто понимают двоичную систему, и те, кто - нет.

Старая шутка.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Че по ТИЦу слышно, убирают его или когда выдача то будет?
5 HavingingWorld 537 8.4.2018, 14:02
автор: Webranger
Открытая тема (нет новых ответов) Сколько страниц рекомендовано добавить перед индексацией?
11 Yurio 1661 15.3.2018, 13:51
автор: Winst
Открытая тема (нет новых ответов) Сколько платить за новости?
8 sebadoh 743 14.3.2018, 14:20
автор: Luchik
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыБудет ли уместно
7 Cunningfox 903 7.3.2018, 22:59
автор: Cunningfox
Опрос (нет новых голосов) Опрос: Будет ли вам интересен блог разработчика...?
7 Konark 2243 1.3.2018, 16:15
автор: Emtec


 



RSS Текстовая версия Сейчас: 19.4.2018, 19:41
Дизайн