2011-11-18 2 views

ответ

1

Пересмотрите ваше значение с помощью десятичной подразумеваемых. НАПРИМЕР.

10 ws-integer      pic 9(7) value 1234567. 
10 ws-decimal redefines ws-integer pic 9(5)v99. 

Когда вы будете называть это как ws-decimal, вы получите 12345.67.

Итак, если вы переместите что-то в ws-целое, вы можете получить к нему доступ с десятичными знаками в правильном положении, используя другое поле.

+0

я пробовал, однако после того, как делать это им получать юдоль, как 34567,00 – user1053713

+0

Вы должны делать «Переместить ws-integer в ws-decimal» вам нужно переопределить область данных. –

6

COBOL предоставляет несколько числовых изображений. Некоторые облегчают арифметические операции , другие облегчают презентацию. Требуется в то время, чтобы отсортировать их все.

Я думаю, вы можете искать подразумеваемое десятичное представление. Подразумевается десятичной обозначено буквой «V» в строке PICTURE, например:

WS-INT-NBR  PIC 9(7). 
    WS-DEC-NBR  PIC 9(5)V99. 

Оба указанных выше деклараций содержит 7 цифр и занимают 7 байт памяти. Вы можете присвоить значение 1234567 для WS-INT-NBR следующим образом:

MOVE 1234567 TO WS-INT-NBR 

но делать то же самое с WS-DEC-НБР будет вызвать переполнение (усечение), поскольку он может содержать только 5 цифр перед тем подразумеваемая десятичная точка («V»). Однако, если вы должны были сделать следующее:

MOVE 12345.67 TO WS-DEC-NBR 

фактическое содержание WS-DEC-НБР будет 1234567 (обратите внимание на десятичную точку исчезает, и он содержит значение, эквивалентное WS-INT-NBR). Это то, что подразумевается под подразумеваемой десятичной точкой . COBOL «знает», что WS-DEC-NBR имеет десятичную точку между 5-й и 6-й цифрами, но на самом деле не сохраняет ее. Любые применяемые операции на WS-DEC-NBR учитывают подразумеваемую десятичную точку.

Вооруженный этими знаниями, вы можете использовать другую функцию COBOL, объявление REDEFINES. REDEFINES сообщает компилятору применить различные правила обработки данных к той же самой области хранения. В одном случае вы хотите, чтобы обрабатывал область памяти как целое число: PIC 9 (7); и в других случаях, таких как подразумеваемое десятичное значение : PIC 9 (5) V99). ли это следующим образом:

01. 
    02 WS-INT-NBR PIC 9(7). 
    02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99. 

Теперь WS-INT-NBR и WS-DEC-NBR занимают ту же область памяти (те же 7 байт). Однако , когда вы ссылаетесь на WS-INT-NBR, используется целочисленное представление. Когда вы ссылаетесь на WS-DEC-NBR, используется десятичное представление .

Это дает нам возможность «не делить на 100» часть вашей проблемы.Следующий бит - , отображающий десятичную точку, когда вам нужно. COBOL предоставляет форматы DISPLAY, содержащие явную «пунктуацию», для которой десятичная точка равна единице. Например:

01 WS-DEC-DISPLAY PIC 9(5).99. 

WS-DEC-DISPLAY содержит явную десятичную точку в пределах своей статьи PICTURE (не путать период в конце строки с вложенным п PICture десятичной точкой). Содержимое WS-DEC-DISPLAY содержит явную десятичную точку. Таким образом, чтобы получить десятичную точки для отображения вам нужно переместить что-то с подразумеваемой десятичной точкой для него, как и в:

MOVE WS-DEC-NBR TO WS-DEC-DISPLAY 

если WS-DEC-NBR содержал «1234567», WS-DEC-DISPLAY будет после «MOVE» введите «12345.67».

Следующая программа и отображает все это вместе для вас:

IDENTIFICATION DIVISION.        
    PROGRAM-ID. EXAMPLE.         
    DATA DIVISION.          
    WORKING-STORAGE SECTION.        
    01.             
     02 WS-INT-NBR PIC 9(7).       
     02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99. 

    01 WS-DEC-DISPLAY PIC 9(5).99. 

    PROCEDURE DIVISION.         
     MOVE 1234567 TO WS-INT-NBR      
     MOVE WS-DEC-NBR TO WS-DEC-DISPLAY    
     DISPLAY 'WS-INT-NBR : ' WS-INT-NBR   
     DISPLAY 'WS-DEC-NBR : ' WS-DEC-NBR   
     DISPLAY 'WS-DEC-DISPLAY: ' WS-DEC-DISPLAY  

     ADD +1 TO WS-INT-NBR        
     MOVE WS-DEC-NBR TO WS-DEC-DISPLAY    
     DISPLAY 'INT-NBR PLUS 1: ' WS-DEC-DISPLAY  

     ADD +1 TO WS-DEC-NBR 
     MOVE WS-DEC-NBR TO WS-DEC-DISPLAY   
     DISPLAY 'DEC-NBR PLUS 1: ' WS-DEC-DISPLAY 

     GOBACK         
     .           

Выход:

WS-INT-NBR : 1234567 
WS-DEC-NBR : 1234567 
WS-DEC-DISPLAY: 12345.67 
INT-NBR PLUS 1: 12345.68 <= notice which digit incremented 
DEC-NBR PLUS 1: 12346.68 <= notice which digit incremented 
+0

Thats достойное объяснение NealB. 'Ненавидит ваше терпение' –

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