При загрузке из 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 1486 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 1486 21.03.18 15:47 Сейчас в теме
(10) вот и разобрались!
Value это то что там на самом деле.
Text это то что вы видите как человек в мониторе.
15. S2Sps 21.03.18 15:57 Сейчас в теме
(14) А происходит это как писал Slava Kron "из-за того, что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки" . Как я понимаю это и есть причина такого расхождения.
17. Xershi 1486 21.03.18 16:41 Сейчас в теме
(15) нет, причина этому в том что у таких чисел задан формат по умолчанию, о котором говрится. А вот вы можете самостоятельно представление изменить в экселе и тогда до вас дойдет дзен=))
18. S2Sps 21.03.18 17:17 Сейчас в теме
(17)Вот так сюрприз. А я уже думал что всё порешали.
Погодите поторопился. Так Вы считаете что причина не в том "что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки". То что я меняю представление чисел в экселе изменяя формат - я понимаю, но не совсем могу понять, как это может повлиять на мою ситуацию. Вы имеете в виду что можно задать такой формат что можно будет видеть число в экселе изначально в виде 5,3899999?
19. Xershi 1486 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 1486 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 1486 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 1486 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 )))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот