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
Сообщений: 1976
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 575 раз
Репутация:   68  


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
Сообщений: 1976
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 575 раз
Репутация:   68  


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
Сообщений: 1976
Регистрация: 21.9.2012
Из: СССР
Поблагодарили: 575 раз
Репутация:   68  



Цитата(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
Сообщений: 3361
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2696 раз
Репутация:   288  


Цитата(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.
Те, кто понимают двоичную систему, и те, кто - нет.

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


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


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


Свернуть

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

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Сколько можно просить за такой аккаунт ВК?
23 qazex 4863 10.9.2017, 21:12
автор: Jorion
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыМожет, хватит терять клиентов? Текст – продавец, который будет работать на вас 24 часа в сутки.
38 Писатель 17895 10.9.2017, 15:56
автор: Писатель
Опрос (нет новых голосов) Опрос: Будет ли вам интересен блог разработчика...?
3 Konark 681 15.8.2017, 22:50
автор: Konark
Открытая тема (нет новых ответов) YouTube покажет, сколько людей смотрят ролик в реальном времени‍
1 MissContent 428 15.8.2017, 15:13
автор: wertu
Открытая тема (нет новых ответов) Требуется человек, который будет продвигать сайт
7 DimaMyrzich 1025 5.5.2017, 17:50
автор: Odins


 



RSS Текстовая версия Сейчас: 19.10.2017, 2:16
Дизайн