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



 

Здравствуйте, гость (

| Вход | Регистрация )

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


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

Пишу на сайте такой код(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


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

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


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


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


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>


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


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



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


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


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


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


Цитата(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


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


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

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

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


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


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


Свернуть

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

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСайты с доходом на продажу. Будет ли спрос?
46 Telnor 45041 30.3.2024, 15:37
автор: trustedadvisor
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСколько времени нужно для раскачки нового сайта?
29 metvekot 8001 8.3.2024, 15:41
автор: malamut
Открытая тема (нет новых ответов) Сколько стоит сделать шаблон для WP?
изучаю цены
3 Palundra 2402 2.4.2022, 3:06
автор: WebSuccessful
Открытая тема (нет новых ответов) Сколько будет стоить лого для сайта?
1 tsa 4253 28.8.2021, 9:41
автор: 0pium
Открытая тема (нет новых ответов) Требуется человек, который будет искать новости на ин.сайтах и переводить
6 Zoya83 2356 21.10.2020, 18:00
автор: Winstrol


 



RSS Текстовая версия Сейчас: 20.4.2024, 1:08
Дизайн