При загрузке из Excel число 5.39 преобразуется в 5.38999999 и т.д. Кто-нибудь знает в чём подвох?

1. S2Sps 21.03.18 12:41 Сейчас в теме
В ячейке excel записано значение 5,39 и отформатировано число 2 знака после ,
xl.Cells(row,7).Value = 5,38999999999
при этом если поменять значение на 4,39 та же картина а вот если на 0,39 то всё норм ну или 5,29 тоже норм.
Найденные решения
2. SlavaKron 21.03.18 13:04 Сейчас в теме
Из за того, что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки. https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB%­D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7%D0%B0%D0%BF­%D1%8F%D1%82%D0%BE%D0%B9
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
9. Xershi 1474 21.03.18 14:59 Сейчас в теме
(1) а когда глазками смотришь, то эксель тебе показывает не валуе а текст:
xl.Cells(row,7).Text= 5,39
10. S2Sps 21.03.18 15:11 Сейчас в теме
(9)
а когда глазками смотришь, то эксель тебе показывает не валуе а текст:
xl.Cells(row,7).Text= 5,39


так точно если xl.Cells(row,7).Text= 5,39
Но я файл новый создавал и вручную забивал данные т.к. тоже копал в эту сторону.
14. Xershi 1474 21.03.18 15:47 Сейчас в теме
(10) вот и разобрались!
Value это то что там на самом деле.
Text это то что вы видите как человек в мониторе.
15. S2Sps 21.03.18 15:57 Сейчас в теме
(14) А происходит это как писал Slava Kron "из-за того, что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки" . Как я понимаю это и есть причина такого расхождения.
17. Xershi 1474 21.03.18 16:41 Сейчас в теме
(15) нет, причина этому в том что у таких чисел задан формат по умолчанию, о котором говрится. А вот вы можете самостоятельно представление изменить в экселе и тогда до вас дойдет дзен=))
18. S2Sps 21.03.18 17:17 Сейчас в теме
(17)Вот так сюрприз. А я уже думал что всё порешали.
Погодите поторопился. Так Вы считаете что причина не в том "что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки". То что я меняю представление чисел в экселе изменяя формат - я понимаю, но не совсем могу понять, как это может повлиять на мою ситуацию. Вы имеете в виду что можно задать такой формат что можно будет видеть число в экселе изначально в виде 5,3899999?
19. Xershi 1474 21.03.18 18:37 Сейчас в теме
(18) смотри картинку во вложении. При 10 знаках идет округление, при 11 будет в тексте, то что и в значении!
Прикрепленные файлы:
20. S2Sps 21.03.18 22:50 Сейчас в теме
(19) Да но при этом в значении excel отображает истинное значение а не .text (смотрите вложение)
А в моём случае excel отображал и имел значение 5.39. А при получении этого числа в 1С я имел значение 5.38999999.
Т.е. как я понял в excel число 5,39 хранится в форме мантиссы и показателя степени двойки ((1,39 / 4) * (2^23)). А при передаче в 1С оно преобразуется обратно, и мы получаем 5,389999866485595703125. Как-то так и да при первом же округлении этого числа даже до 6 знаков после запятой мы тут же получаем 5,39. Возможно я неправильно понял. Поправьте меня пожалуйста если так.
Прикрепленные файлы:
21. Xershi 1474 21.03.18 23:06 Сейчас в теме
(20) смотрите картинку внимательно! А то Остапа понесло! Игра называется найди 10 отличий))
22. S2Sps 22.03.18 12:13 Сейчас в теме
(21) Послушайте Максим. Если Я чего-то неправильно понял и Вы всё же правда мне хотите помочь то я Вас прошу. Укажи те на то место где я всё же не правильно понял причину данного преобразования при получении числа с excel. Получив сообщение с форматированием от Вас, я не только посмотрел я ещё и попробовал обыграть такую же ситуацию в excel. Но больше убедился в правоте Slava Kron. Т.к. у меня в значении всегда отображалось 5,39 и ничего больше и я говорю сейчас не о ячейке где можно применить форматирование и получить разные варианты а о строке формул где выводится реальное значение ячейки. Это видно в последней картинке. Т.е. я в ячейке имею значение 5,39 и никакого другого. Но передается оно как 5,3899999. И форматирование никак не влияет на это в моём случае. Так куда я должен посмотреть что бы осознать что я не понял Вас правильно? Можете мне пояснить как Остапу ;). Дабы меня опять не унесло в неверном направлении )))
23. Xershi 1474 22.03.18 19:26 Сейчас в теме
(22) в (19) все написано и показано! Читайте перед сном может поймете.
24. пользователь 23.03.18 14:12
Сообщение было скрыто модератором.
...
2. SlavaKron 21.03.18 13:04 Сейчас в теме
Из за того, что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки. https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB%­D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7%D0%B0%D0%BF­%D1%8F%D1%82%D0%BE%D0%B9
3. S2Sps 21.03.18 13:13 Сейчас в теме
4. S2Sps 21.03.18 14:12 Сейчас в теме
(2)Не знал этих вещей. Не то образование )
Но прочитав так и не смог осилить почему же 5,39 или 4.39 преобразует в *,389999 а вот уже 3,39 в 3,39? ведь как я понимаю ведь мантисса 5,39?
8. SlavaKron 21.03.18 14:59 Сейчас в теме
(4)
Ок, давайте разложим 5.39 на мантиссу и порядок для числа одинарной точности (32 бит / Float / single):
Сначала найдём какое максимальное (2^х) умещается в нашем числе. Для 5.39 - это 4.
В мантиссе у нас зашифрован как бы остаток от (5.39 - 4). Это 1.39. Чтобы узнать чему равна мантисса в десятичной с/с, надо наш нормализованный остаток умножить на 2^23. нормализованный остаток = 1,39 / 4.
Мантисса = (1,39 / 4) * (2^23) = 2915041,28. Округлённо = 2915041.

Так вот в памяти хранятся только знак числа, экспонента и мантисса, а когда нужно вернуть его представление, получаем:
2915041 / 2^23 * 4 + 4 = 5,389999866485595703125
Калькулятор в помощь http://www.binaryconvert.com/convert_float.html
Другой вопрос, почему, например, 3,39 отображается нормально. Предположу, что после вычисления приближенного значения происходит округление до определенного знака и для 3.9 приближенное значение ближе к оригиналу, чем для 5.39
11. S2Sps 21.03.18 15:35 Сейчас в теме
(8) Спасибо за помощь уже гораздо понятнее. И если пользоваться этим калькулятором то можно заметить что
5,39 = 5.389999866485595703125E0
4,39 = 4.389999866485595703125E0
3,39 = 3.3900001049041748046875E0

хотя у меня 5,39 = 5,38999999999999
Тоже немного не сходится
12. SlavaKron 21.03.18 15:38 Сейчас в теме
5. splxgf 21.03.18 14:46 Сейчас в теме
s = 0
For i = 0 To 100
  s = s + 0.01
  Debug.Print s
Next


0,79
0,8
0,810000000000001
0,820000000000001
0,830000000000001
0,840000000000001
0,850000000000001
0,860000000000001
0,870000000000001
0,880000000000001
0,890000000000001
0,900000000000001
0,910000000000001
0,920000000000001
0,930000000000001
0,940000000000001
0,950000000000001
0,960000000000001
0,970000000000001
0,980000000000001
0,990000000000001
1
1,01
Показать


К этому надо привыкнуть или использовать языки программирования с более точной математикой.
6. S2Sps 21.03.18 14:56 Сейчас в теме
(5)Странно что это происходит на 5.39 и 4.39 а вот с 3.39 или 0.39 уже не происходит
7. Xershi 1474 21.03.18 14:58 Сейчас в теме
(6) в экселе формула какая-то и реальное значение то что загрузили. Визуально показывает другое значение, такое бывает, например с датами!
13. гаврюша 2 21.03.18 15:40 Сейчас в теме
Может определить формат колонки ("число" и количество десятичных знаков) и настроить точность как на экране?
16. S2Sps 21.03.18 16:23 Сейчас в теме
(13)Мне правда интересно как так? Колонка числом и была, только количество знаков после запятой не указывал. Сначала поставил 5 знаков после запятой и получил внимание 5,39000. Попробовал и 2 знака тоже 5,39. Хотя UsedRange.Cells(row,7).Value = 5.38999999999999. Результат округления. Если ставить 15 знаков после запятой то 5.38999999999999 )))
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)