|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Доброе время суток всем! Система - 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: Где то, месяц назад с похожей проблемой открывал топик, но так и не разобрался ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 04:40 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Да, косяки есть. Даже после уменьшения разрядности в поле до (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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 05:21 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
И что это может значить? На самом деле табличка со многими полями и довольно большая так вот если делать там запрос select sum(indt) from то получаеться полная лажа, на несколько копеек отличаеться от правильного, хотя все значения с двумя знаками полсе запятой - деньги ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 05:41 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Galyamov Rinat Даже после уменьшения разрядности в поле до (14,5) Сделайте разрядность поля 13.5 и все будет в порядке. Зависит, скорей всего, опять же от максимальной расчетной разрядности в FoxPro - 14 знаков. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 06:01 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Kruchinin Pahan Сделайте разрядность поля 13.5 и все будет в порядке. Зависит, скорей всего, опять же от максимальной расчетной разрядности в FoxPro - 14 знаков. К сожалению не помогло ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 06:13 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Косяк в точности вычислений: Код: plaintext 1. 2.
Вероятно в реальности хранится что-то типа 37630156.11999999 (это вполне возможно если в памяти число хранится в двоичном формате с плавающей запятой), а при выводе округляется до 5-ти знаков после запятой. Функция INT() в таком случае просто отбросит 9-ки на конце. Поэтому тебе надежнее использовать ROUND(indt*100, 0) или брать тип CURRENCY для хранения сумм, там нет проблем с потерей копеек, но есть проблемы с делением. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:27 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
потому что ИНТ - это целая часть по Басику, когда о цифрах в таких масштабах небось и немышляли А вам нужно просто запомнить, что стандартно знаковый ИНТ от -2 147 483 648 до 2147 483 647, а в девятке обойти эти ограничения можно как Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:34 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Hel!Riserчстандартно знаковый ИНТ от -2 147 483 648 до 2147 483 647 Ловко ты тип INTEGER c функцией INT() в одну кучу смешал ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:41 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Dima TКосяк в точности вычислений: Код: plaintext 1. 2.
Вероятно в реальности хранится что-то типа 37630156.11999999 (это вполне возможно если в памяти число хранится в двоичном формате с плавающей запятой), а при выводе округляется до 5-ти знаков после запятой. Функция INT() в таком случае просто отбросит 9-ки на конце. Поэтому тебе надежнее использовать ROUND(indt*100, 0) или брать тип CURRENCY для хранения сумм, там нет проблем с потерей копеек, но есть проблемы с делением. Но ведь dbf это ведь текстач простой с определенной структурой, так вот если смотреть этот файл в каком нибудь текстовом редакторе то там сумма 37630156.12000 а не 37630156.11999999, это fox так глючит на некоторых числах чтоли? кстати с 597097465.17 такая же бодяга ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:42 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Dima T Ловко ты тип INTEGER c функцией INT() в одну кучу смешал Дык везде же придел должен быть. Почему бы и не провести и такую загагулину?! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:48 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
colt76Но ведь dbf это ведь текстач простой с определенной структурой, так вот если смотреть этот файл в каком нибудь текстовом редакторе то там сумма 37630156.12000 а не 37630156.11999999, это fox так глючит на некоторых числах чтоли? кстати с 597097465.17 такая же бодяга DBF хранит NUMERIC текстом, но никто не утверждает что для расчетов оно не конвертируется в какой-то внутренний формат. И этот внутренний формат что-то типа DOUBLE (двоичное с плавающей запятой), т.к. с ним процессор напрямую умеет работать, но у него есть проблемы с точностью, т.к. невозможно точно перевести дробное число из десятичной системы в двоичную, почти всегда есть погрешность, для устранения этого используются какие-то хитрые алгоритмы для обратного отображения в десятичный вид, но на больших числах это не всегда правильно происходит. Хотя в документации заявлена точность 15 первых разрядов, в твоем случае хватило 10-ти ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 09:56 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
И как доверять тогда? не доверять? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 10:03 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
colt76И как доверять тогда? не доверять? Если ROUND(..., 0) не подходит, то переходи на тип CURENCY для денег, там потерь при сложении/вычитании/умножении никаких нет, т.к. реально это 8-байтовый INT со сдвинутой точкой на 4 разряда при отображении Код: plaintext 1. 2. 3.
но при делении сразу все откидывает после 4-го знака после запятой Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 10:17 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 10:54 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
colt76Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить дык чем те КАСТовать-то не нравится? Хоть до пятого уровня после зпт, хоть до какой Сделал файл бы давно и отослал, а не разводить слюни на 6 часов ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 11:14 |
|
dbf - сломал моск
|
|||
---|---|---|---|
#18+
colt76Да мне просто файл dbf нужно подготовить в другую организацию, а там поле должно быть нумерик, я и сделал, но решился проверить а дебет с кредитам не сходиться копейки съедает где-то, в общем если вдруг у них тоже проверка не пройдет, надо как то доказвать что вроде как все правильно просто это компьютер виноват и им надо в CURENCY сконвертить 1. Зачем на 100 тогда умножать и INT() делать? Сумму посчитай с копейками и все. 2. Непонятно - если сам файл готовишь и поле под деньги, то почему там 5 знаков после запятой? Сделай N(15,2), не заставляй фокс с точностью выше требуемой считать. 3. Про CAST() и ROUND() ничего не сказал чем они тебе не понравились 4. Если файл не большой - проверку в экселе можно сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 11:45 |
|
|
start [/forum/topic.php?fid=41&fpage=148&tid=1587306]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 152ms |
0 / 0 |