powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / dbf - сломал моск
16 сообщений из 16, страница 1 из 1
dbf - сломал моск
    #35531002
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток всем!
Система - WINXP, Visual FoxPro 9.0.
есть err.dbf с одной записью (приложил), формат вроде бы dbase3, в поле indt значение 37630156.12000
когда выполняю запрос SELECT INT(indt*100) a1, indt*100 a2 FROM err
выдает:
a1 = 3763015611
a2 = 3763015612.00000
Плиз, попробуйте у себя выполнить на моей таблице и сообщите о результатах.

PS: Где то, месяц назад с похожей проблемой открывал топик, но так и не разобрался
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531010
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, косяки есть.

Даже после уменьшения разрядности в поле до (14,5)
И даже после преобразования поля в тип double, поведение не изменилось

Интересный результат дает строка
?indt*100, INT(indt*100), ROUND(indt*100,0), 3763015612,
(indt*100)-3763015612, indt*100=3763015612


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531013
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что это может значить?
На самом деле табличка со многими полями и довольно большая так вот если делать там запрос
select sum(indt) from
то получаеться полная лажа, на несколько копеек отличаеться от правильного, хотя все значения с двумя знаками полсе запятой - деньги
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531016
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat
Даже после уменьшения разрядности в поле до (14,5)

Сделайте разрядность поля 13.5 и все будет в порядке. Зависит, скорей всего, опять же от максимальной расчетной разрядности в FoxPro - 14 знаков.
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531019
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kruchinin Pahan
Сделайте разрядность поля 13.5 и все будет в порядке. Зависит, скорей всего, опять же от максимальной расчетной разрядности в FoxPro - 14 знаков.

К сожалению не помогло
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531160
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Косяк в точности вычислений:
Код: plaintext
1.
2.
x =  37630156 . 12000 
? x *  100000 
? int(x *  100000 ) && =  3763015611999 

Вероятно в реальности хранится что-то типа 37630156.11999999 (это вполне возможно если в памяти число хранится в двоичном формате с плавающей запятой), а при выводе округляется до 5-ти знаков после запятой. Функция INT() в таком случае просто отбросит 9-ки на конце.

Поэтому тебе надежнее использовать ROUND(indt*100, 0) или брать тип CURRENCY для хранения сумм, там нет проблем с потерей копеек, но есть проблемы с делением.
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531171
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что ИНТ - это целая часть по Басику, когда о цифрах в таких масштабах небось и немышляли А вам нужно просто запомнить, что стандартно знаковый ИНТ от -2 147 483 648 до 2147 483 647, а в девятке обойти эти ограничения можно как
Код: plaintext
 SELECT CAST(indt* 100  AS N( 19 , 0 )) a1, indt* 100  a2 FROM err
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531185
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hel!Riserчстандартно знаковый ИНТ от -2 147 483 648 до 2147 483 647

Ловко ты тип INTEGER c функцией INT() в одну кучу смешал
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531187
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКосяк в точности вычислений:
Код: plaintext
1.
2.
x =  37630156 . 12000 
? x *  100000 
? int(x *  100000 ) && =  3763015611999 

Вероятно в реальности хранится что-то типа 37630156.11999999 (это вполне возможно если в памяти число хранится в двоичном формате с плавающей запятой), а при выводе округляется до 5-ти знаков после запятой. Функция INT() в таком случае просто отбросит 9-ки на конце.

Поэтому тебе надежнее использовать ROUND(indt*100, 0) или брать тип CURRENCY для хранения сумм, там нет проблем с потерей копеек, но есть проблемы с делением.

Но ведь dbf это ведь текстач простой с определенной структурой, так вот если смотреть этот файл в каком нибудь текстовом редакторе то там сумма 37630156.12000 а не 37630156.11999999, это fox так глючит на некоторых числах чтоли? кстати с 597097465.17 такая же бодяга
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531207
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Ловко ты тип INTEGER c функцией INT() в одну кучу смешал
Дык везде же придел должен быть. Почему бы и не провести и такую загагулину?!
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531223
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colt76Но ведь dbf это ведь текстач простой с определенной структурой, так вот если смотреть этот файл в каком нибудь текстовом редакторе то там сумма 37630156.12000 а не 37630156.11999999, это fox так глючит на некоторых числах чтоли? кстати с 597097465.17 такая же бодяга
DBF хранит NUMERIC текстом, но никто не утверждает что для расчетов оно не конвертируется в какой-то внутренний формат. И этот внутренний формат что-то типа DOUBLE (двоичное с плавающей запятой), т.к. с ним процессор напрямую умеет работать, но у него есть проблемы с точностью, т.к. невозможно точно перевести дробное число из десятичной системы в двоичную, почти всегда есть погрешность, для устранения этого используются какие-то хитрые алгоритмы для обратного отображения в десятичный вид, но на больших числах это не всегда правильно происходит.
Хотя в документации заявлена точность 15 первых разрядов, в твоем случае хватило 10-ти
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531244
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как доверять тогда? не доверять?
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531284
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colt76И как доверять тогда? не доверять?
Если ROUND(..., 0) не подходит, то переходи на тип CURENCY для денег, там потерь при сложении/вычитании/умножении никаких нет, т.к. реально это 8-байтовый INT со сдвинутой точкой на 4 разряда при отображении

Код: plaintext
1.
2.
3.
x = $ 37630156 . 12000 
? x *  10000 
? int(x *  10000 ) && =  3763015612000 

но при делении сразу все откидывает после 4-го знака после запятой

Код: plaintext
1.
2.
x = $ 1 . 2345 
? x /  100  *  100  && =  1 . 2300 
? x *  100  /  100  && =  1 . 2345 
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531368
colt76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531435
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colt76Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить

дык чем те КАСТовать-то не нравится? Хоть до пятого уровня после зпт, хоть до какой Сделал файл бы давно и отослал, а не разводить слюни на 6 часов
...
Рейтинг: 0 / 0
dbf - сломал моск
    #35531523
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colt76Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить

1. Зачем на 100 тогда умножать и INT() делать? Сумму посчитай с копейками и все.
2. Непонятно - если сам файл готовишь и поле под деньги, то почему там 5 знаков после запятой? Сделай N(15,2), не заставляй фокс с точностью выше требуемой считать.
3. Про CAST() и ROUND() ничего не сказал чем они тебе не понравились
4. Если файл не большой - проверку в экселе можно сделать
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / dbf - сломал моск
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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