If you want to have exact decimals in Pascal, you have to use the currency type.
program Zadanie2;
var r : currency;
begin
r:=2.1;
while r <> 4.3 do
begin
r:= r + 0.1;
writeln(r:0:2);
end;
end.
Now the output ends at 4.30.
As you can notice, I also changed the format so you don't get the scientific notation.
Code and results: http://ideone.com/Hf65v2
Answer from Andrew on Stack OverflowVideos
If you want to have exact decimals in Pascal, you have to use the currency type.
program Zadanie2;
var r : currency;
begin
r:=2.1;
while r <> 4.3 do
begin
r:= r + 0.1;
writeln(r:0:2);
end;
end.
Now the output ends at 4.30.
As you can notice, I also changed the format so you don't get the scientific notation.
Code and results: http://ideone.com/Hf65v2
I fixed it by replacing
while r <> 4.3
with
while r < 4.4
But still, it's not a real solution
I guess there is nothing I can do with compiler
The Format() function is normally used in situations like this.
WriteLn(Format('%*.*f', [0, dec, your_real_number]));
*.* is interpreted as total_characters.decimal_digits. Passing zero for the first means that width is adjusted according to how large your real is. The number of decimals can be a variable (dec), which you can adjust to your specification.
Update:
You mention that you want an exact representation of a float with respect to the number of decimals.
As mentioned in my comment, most floating point values does not have a finite number of decimals. And most decimal fractions cannot be represented by a binary type.
There are some libraries that can handle floating point values of arbitrary size. See TBigFloat for example. There is a formatting routine that can strip redundant zeroes from a decimal float.
Still, there is a possibility to remove trailing zeroes by using the general format specifier:
WriteLn(Format('%g',[your_real_number]));
You can specify the width and the number of significant digits as well.
For example, if you have input x=1.51 in real variable type, then you write only writeln(x), the output will be 1.5100000000. If you write writeln(x:0:3), the output will be 1.510 (3 digits after ".") ...
var x: real;
Begin
x:=1.51;
writeln(x); //output 1.5100000000
writeln(x:0:4); //output 1.5100 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End.
From your other example, if your input is 1.512426, with writeln(x:0:5) it will only show 5 digits after "." and the output will be 1.51242
var x: real;
Begin
x:=1.512426;
writeln(x); //output 1.5124260000
writeln(x:0:4); //output 1.5124 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End.
So, if you write writeln(x:0:dec) the output will be "dec" digits after "."
Hope this helps, I'm just trying to answer from a different perspective.