В ячейке excel записано значение 5,39 и отформатировано число 2 знака после ,
xl.Cells(row,7).Value = 5,38999999999
при этом если поменять значение на 4,39 та же картина а вот если на 0,39 то всё норм ну или 5,29 тоже норм.
(14) А происходит это как писал Slava Kron "из-за того, что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки" . Как я понимаю это и есть причина такого расхождения.
(15) нет, причина этому в том что у таких чисел задан формат по умолчанию, о котором говрится. А вот вы можете самостоятельно представление изменить в экселе и тогда до вас дойдет дзен=))
(17)Вот так сюрприз. А я уже думал что всё порешали.
Погодите поторопился. Так Вы считаете что причина не в том "что вещественные числа в экселе - это числа с плавающей запятой, то есть число хранится в форме мантиссы и показателя степени двойки". То что я меняю представление чисел в экселе изменяя формат - я понимаю, но не совсем могу понять, как это может повлиять на мою ситуацию. Вы имеете в виду что можно задать такой формат что можно будет видеть число в экселе изначально в виде 5,3899999?
(19) Да но при этом в значении excel отображает истинное значение а не .text (смотрите вложение)
А в моём случае excel отображал и имел значение 5.39. А при получении этого числа в 1С я имел значение 5.38999999.
Т.е. как я понял в excel число 5,39 хранится в форме мантиссы и показателя степени двойки ((1,39 / 4) * (2^23)). А при передаче в 1С оно преобразуется обратно, и мы получаем 5,389999866485595703125. Как-то так и да при первом же округлении этого числа даже до 6 знаков после запятой мы тут же получаем 5,39. Возможно я неправильно понял. Поправьте меня пожалуйста если так.
(21) Послушайте Максим. Если Я чего-то неправильно понял и Вы всё же правда мне хотите помочь то я Вас прошу. Укажи те на то место где я всё же не правильно понял причину данного преобразования при получении числа с excel. Получив сообщение с форматированием от Вас, я не только посмотрел я ещё и попробовал обыграть такую же ситуацию в excel. Но больше убедился в правоте Slava Kron. Т.к. у меня в значении всегда отображалось 5,39 и ничего больше и я говорю сейчас не о ячейке где можно применить форматирование и получить разные варианты а о строке формул где выводится реальное значение ячейки. Это видно в последней картинке. Т.е. я в ячейке имею значение 5,39 и никакого другого. Но передается оно как 5,3899999. И форматирование никак не влияет на это в моём случае. Так куда я должен посмотреть что бы осознать что я не понял Вас правильно? Можете мне пояснить как Остапу ;). Дабы меня опять не унесло в неверном направлении )))
(2)Не знал этих вещей. Не то образование )
Но прочитав так и не смог осилить почему же 5,39 или 4.39 преобразует в *,389999 а вот уже 3,39 в 3,39? ведь как я понимаю ведь мантисса 5,39?
(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
(8) Спасибо за помощь уже гораздо понятнее. И если пользоваться этим калькулятором то можно заметить что
5,39 = 5.389999866485595703125E0
4,39 = 4.389999866485595703125E0
3,39 = 3.3900001049041748046875E0
хотя у меня 5,39 = 5,38999999999999
Тоже немного не сходится
(13)Мне правда интересно как так? Колонка числом и была, только количество знаков после запятой не указывал. Сначала поставил 5 знаков после запятой и получил внимание 5,39000. Попробовал и 2 знака тоже 5,39. Хотя UsedRange.Cells(row,7).Value = 5.38999999999999. Результат округления. Если ставить 15 знаков после запятой то 5.38999999999999 )))