delphi - 小数舍入和打印机选择

标签 delphi decimal rounding

我使用来自 http://cc.embarcadero.com/item/21909 的 Delphi RAD Studio 2010 和 DecimalRounding_JH1.pas .

它工作得很好,但我不知道为什么,在一些旧机器(带有Windows XP SP3的Pentium IV)中,访问printer.printerindex后回合失败。我已检查问题不是 Windows XP,因为它可以在其他具有此操作系统的计算机上运行。

我制作了一个简单的项目,使用 DecimalRounding_JH1 (drHalfUp) 对扩展值进行四舍五入,保留两位小数(1.105 -> 四舍五入到 1.11)。但如果我读取 Printer.printerindex,则 1.105 四舍五入为 1.10)。

我认为这可能是“FDIV bug”,但使用“FDIV safe”编译并不能解决问题。

代码:

var d1,d2:extended;
    i:integer;
begin
     d1:=1.105;
     d2:=DecimalRounding_JH1.DecimalRoundExt(d1,2,drHalfUp);
     memo1.lines.add(FloatToStr(d2));   // --> shows 1.11 (OK)
     i:=Printer.printerindex;
     d2:=DecimalRounding_JH1.DecimalRoundExt(d1,2,drHalfUp);
     memo1.lines.add(FloatToStr(d2));   // --> shows 1.10 (ERROR!!!)
     ...

我知道这很奇怪,但我测试过,正如我所说。 我能做什么?

编辑: 如果我在 i:=Printer.printerindex; 之前添加 Printer.printerindex:=1; (例如),那么它又可以正常工作。读取打印机单元,区别在于是否执行“SetToDefaultPrinter”:

function TPrinter.GetPrinterIndex: Integer;
begin
  if FPrinterIndex = -1 then SetToDefaultPrinter;
  Result := FPrinterIndex;
end;

提前致谢。

最佳答案

系统打印机库的某些部分有修改 8087 控制字的相当讨厌的习惯。使用Printer的方法和属性后应将其恢复为默认值。

例如,您可以这样写:

Set8087CW(Default8087CW);

我的代码库中的注释建议您只需要在 VCL 打印机代码首次初始化后执行此操作。所以你可以在程序启动时处理这个问题。读取Printer.PrinterIndex,然后立即将控制字设置为其所需的值。

关于delphi - 小数舍入和打印机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23343358/

相关文章:

Delphi,ListView,如何删除vsIcon中项目之间的边距

c# - C# 中的 float 到十六进制

python - 在 django 管理中显示带有货币的 DecimalField

excel - 如何将数字四舍五入到最接近的 0.5?

delphi - 如何让我的控制台应用程序接收窗口消息?

delphi - 列表和 BinarySearch 索引并非全部正确

delphi - LPLONG 的 Delphi 等效项是什么?

c# - 小数点使用逗号,千位 rdlc 报告使用句点

c++ - 我怎样才能得到 double 值?

sql - 我如何四舍五入到一个完整的整数postgres