powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Int()
18 сообщений из 18, страница 1 из 1
Int()
    #32436559
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья!
А кто знает, почему у меня
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int( 2 , 115  *  1000 ) =  2115 

работает правильно, а вот 

int( 1 , 115  *  1000 ) =  1114 

вместо  1115  ?
...
Рейтинг: 0 / 0
Int()
    #32436563
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Потому что 1.115 хранится приблизительно как 1.114999999999999...
...
Рейтинг: 0 / 0
Int()
    #32436582
frverfgverg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да здравствует явное преобразование типов!

? int(ССur(2.115) * 1000)
...
Рейтинг: 0 / 0
Int()
    #32436594
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А зачем вообще так использовать int? Оно всегда будет округлять вниз, даже если дробная часть больше, чем 0.9. Если уж округлять, то не вниз, а к ближайшему целому.

int(1.115 * 1000 + 0.5) = 1115
...
Рейтинг: 0 / 0
Int()
    #32436609
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж округлять, то не вниз, а к ближайшему целому
Нет уж, Саныч, компромис - не для нас!
Никаких полумер! Никаких "ближайших целых"!
Только вверх, к большему целому!
На меньшее я не согласен!

кому куда надо по условиям задачи - тот пусть туда и округляет
...
Рейтинг: 0 / 0
Int()
    #32436691
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир Саныч
Потому что 1.115 хранится приблизительно как 1.114999999999999...

А как с этим бороться?

Владимир Саныч
Если уж округлять, то не вниз, а к ближайшему целому.

По задаче нужно всегда вниз.

frverfgverg
Да здравствует явное преобразование типов!
? int(ССur(2.115) * 1000)

А как же
Код: plaintext
1.
Int(CCur( 1 . 11115 ) *  100000 )

дает 111120, а надо 111115 ?
...
Рейтинг: 0 / 0
Int()
    #32436730
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СанычПотому что 1.115 хранится приблизительно как 1.114999999999999...
А 2.115 как хранится? Разве не как 2.114999999999999?
...
Рейтинг: 0 / 0
Int()
    #32436733
frverfgverg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как же \r
Int(CCur(1.11115) * 100000)\r
дает 111120, а надо 111115 ?\r
\r
денежный тип хранит до 4-х знаков после запятой, поэтому VBA приходится сперва округлить, т.е. фактически получается Int(CCur(1.1112) * 100000)\r
\r
З.Ы. посмотри здесь про округление
...
Рейтинг: 0 / 0
Int()
    #32436749
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
авторА как с этим бороться?
Изобретать комп, который работает по десятичной системе счисления.
...
Рейтинг: 0 / 0
Int()
    #32436752
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ТемныйА 2.115 как хранится? Разве не как 2.114999999999999?
А вот, видимо, нет. А, скажем, как 2.115000000000000001.
...
Рейтинг: 0 / 0
Int()
    #32436798
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для борьбы - cdec
int(cdec((1,115) * 1000)

по поводу "меньшего" - int - это оно и есть - строго к меньшему по значению, т.е. int(-1,5)=-2.
...
Рейтинг: 0 / 0
Int()
    #32436800
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пускай он как хочет хранит, результат должен быть правильный и соответствовать описанию функции....

это какая то лажа с INT конкретно

а все объяснения что в двоичном виде число такое -то выглядит так и это приблезительно 1.114999999999999 - объяснения причины бага
...
Рейтинг: 0 / 0
Int()
    #32436814
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
АлексейКрезультат должен быть правильный и соответствовать описанию функции
И запретить компьютерам пользоваться двоичной системой для промежуточных результатов!
...
Рейтинг: 0 / 0
Int()
    #32436815
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем запрещать? пусть хоть на пальцах считает или числа как стринги хранит и считает в столбик ))
...
Рейтинг: 0 / 0
Int()
    #32436818
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для АлексейК - Владимир Саныч ШИБКО прав. Эта песня поется двумя куплетами:
Преобразования неявные используются на всех (2x) этапах от вычисления выражения внутри Int, до возврата значения. снаружи - Int (в соответсвии с документацией) возвращает на самом деле double c "зануленной" дробной частью. Теперь внутри - 2.115 как и 1.115 по умолчанию - double, 1000 - int при вычислении 1000 приводится к "большему" типу double, дальше перемножаются doubl-ы и от результата ОТБРАСЫВАЕТСЯ дробная часть.

Поэтому рассуждения про "как хранится" (вычисляется) - это не описание бага - а просто пилюля. ее надо принять.
...
Рейтинг: 0 / 0
Int()
    #32436820
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Предлагаю компромисс. Дадим возможность программисту решать, хочет ли он по двоичной системе или "медленно, но верно".
...
Рейтинг: 0 / 0
Int()
    #32436822
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim thousand As Currency
thousand = 1000
Dim myval As Double
myval = 1.115
Debug.Print Int(myval * thousand) ' 1114

Dim thousand As Currency
thousand = 1000
Dim myval As Currency
myval = 1.115
Debug.Print Int(myval * thousand) ' 1115
...
Рейтинг: 0 / 0
Int()
    #32436958
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю Victosha за
Код: plaintext
CDec()
и за понимание... видимо глубокое понимание разницы типов.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Int()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]