2016-07-28 6 views
4

У меня есть номера фиксированной запятой в файле, по одному в каждой строке, в этом формате S9(6)V9(2), но когда они действительно читаются, я получаю non numeric ошибок при попытке поместить их в математику операции. Более того, когда я пытаюсь отобразить их в программе, число, которое записано в файле как 567123.45 сохраняется в переменной как +567123.04. И, например, номер из файла 123.45 сохраняется в переменной как +123.45.00, и это вызывает ошибку 'WS-VALUE' not numeric: '123.45 0' во время математической операции. Почему это? Я использую OpenCobolIDE 4.7.4 для Windows.Чтение чисел с плавающей запятой из файла в COBOL

EDIT: Файл содержит записи следующего вида отделенного новыми линиями (читать READ операции записи после записи):

01 WS-OPERATION. 
    05 WS-ID PIC A(2). 
    05 WS-CLIENT PIC 9(5). 
    05 WS-COUNTRY PIC A(4). 
    05 WS-VALUE PIC S9(6)V9(2). 
+0

Во-первых: это не объекты с плавающей запятой, так как только «ИСПОЛЬЗОВАНИЕ FLOAT ...» являются элементами с плавающей запятой. На самом деле это элементы фиксированной точки. Вопросы: Какой компилятор вы используете? Я предполагаю, что стандартный отправленный GnuCOBOL 1.1 - Если вы изменили пути компилятора, вы найдете эту информацию в меню? -> Об OpenCobolIDE. Как вы читаете файл, как выглядит файл и его описание записи? Как выглядит выражение 'DISPLAY'? –

+0

Да, я использую версию 1.1.0. Я отредактировал сообщение о структуре файла. – Quentin

+0

Я настоятельно рекомендую отредактировать часть «с плавающей запятой» до «фиксированной точки». –

ответ

5

Причина заключается в том, что вы пытаетесь не-редактировать поле. 567123.45 в данных не соответствует PIC S9(6)V9(2), но до -9(6).9(2). - внутренние сохраненные данные и данные печати.

Просто изменить определение и использование MOVE WS-VALUE TO WS-VALUE-INTERNAL (который определяется, как вы хотите) может работы с конкретным компилятором (и конкретными данными), но я бы пойти другой путь:

Я предлагаю до всегда проверяйте данные перед тем, как что-то сделать с ним (файл может быть поврежден или изменен внешним). По крайней мере, проверьте простые числовые данные, например WS-CLIENT, за IS NUMERIC и либо выполните полную проверку в поле данных WS-VALUE, либо, по крайней мере, используйте MOVE FUNCTION NUMVAL(WS-VALUE) TO WS-VALUE-INTERNAL.

 Смежные вопросы

  • Нет связанных вопросов^_^