Double vs FLOAT - 不明确的MathFloor错误 - 页 7

 
Maxim Kuznetsov:
根据你的目标,有时完全采用整数是值得的。它节省了大量的神经 :-)有一次,我有一个任务,我必须精确地标出许多层,起初我在双倍上挣扎,后来我把所有的东西都从0转换为整数点,一切都变得容易、简单和没有错误。
这正是我所做的。我把它转换成了整数。
 
Vladimir:

除非任务需要,否则你不需要使用四舍五入。


这就是问题所在:任务是不同的 :-)

 

如果你使用MathFloor MathCeil 进行四舍五入,你需要将原始结果归一到正确的精度。

因为在计算过程中,你可能得到的不是一个整数,而是一个小数,由于这个数字的"尾巴 "被错误地四舍五入,结果是不正确的。
比如说。

double point=0.01;
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));

现在让我们试试用MathFloor 进行四舍五入

double point=0.01;
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
 

如果我将数字归一化 为1.05 - 它将归一化为1.1,原则上这不是我 使用MathFloor所需要的:-)

因为我根本就不会使用MathFloor

但问题是不同的。

 

Но задача то другая.  

你说你需要四舍五入 -MathFloor 正是这样做的。

 
Taras Slobodyanik:

你说你需要四舍五入 - 这就是MathFloor的工作。

是的!!!但如果我做一个归一化,它就会把数学四舍五入,MathFloor 就没有意义了。

 

在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。

也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12,这就是导致你绞尽脑汁的 "特殊性"。

 
Taras Slobodyanik:

在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。

也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12--这就是你问题的 "特殊性"。

是的 :-)谢谢。