Double vs FLOAT - 不明确的MathFloor错误 - 页 7 1234567 新评论 Vladislav Andruschenko 2017.02.27 09:03 #61 Maxim Kuznetsov: 根据你的目标,有时完全采用整数是值得的。它节省了大量的神经 :-)有一次,我有一个任务,我必须精确地标出许多层,起初我在双倍上挣扎,后来我把所有的东西都从0转换为整数点,一切都变得容易、简单和没有错误。 这正是我所做的。我把它转换成了整数。 Vladislav Andruschenko 2017.02.27 09:30 #62 Vladimir:除非任务需要,否则你不需要使用四舍五入。 这就是问题所在:任务是不同的 :-) Taras Slobodyanik 2017.02.27 10:59 #63 如果你使用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))); Vladislav Andruschenko 2017.02.27 11:02 #64 如果我将数字归一化 为1.05 - 它将归一化为1.1,原则上这不是我 使用MathFloor所需要的:-)因为我根本就不会使用MathFloor。 但问题是不同的。 Taras Slobodyanik 2017.02.27 11:07 #65 Но задача то другая. 你说你需要四舍五入 -MathFloor 正是这样做的。 Vladislav Andruschenko 2017.02.27 11:09 #66 Taras Slobodyanik:你说你需要四舍五入 - 这就是MathFloor的工作。是的!!!但如果我做一个归一化,它就会把数学四舍五入,MathFloor 就没有意义了。 Taras Slobodyanik 2017.02.27 11:22 #67 在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12,这就是导致你绞尽脑汁的 "特殊性"。 Vladislav Andruschenko 2017.02.27 11:23 #68 Taras Slobodyanik:在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12--这就是你问题的 "特殊性"。是的 :-)谢谢。 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
根据你的目标,有时完全采用整数是值得的。它节省了大量的神经 :-)有一次,我有一个任务,我必须精确地标出许多层,起初我在双倍上挣扎,后来我把所有的东西都从0转换为整数点,一切都变得容易、简单和没有错误。
除非任务需要,否则你不需要使用四舍五入。
这就是问题所在:任务是不同的 :-)
如果你使用MathFloor 或MathCeil 进行四舍五入,你需要将原始结果归一到正确的精度。
因为在计算过程中,你可能得到的不是一个整数,而是一个小数,由于这个数字的"尾巴 "被错误地四舍五入,结果是不正确的。
比如说。
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));
现在让我们试试用MathFloor 进行四舍五入
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
如果我将数字归一化 为1.05 - 它将归一化为1.1,原则上这不是我 使用MathFloor所需要的:-)
因为我根本就不会使用MathFloor。
但问题是不同的。
Но задача то другая.
你说你需要四舍五入 -MathFloor 正是这样做的。
你说你需要四舍五入 - 这就是MathFloor的工作。
是的!!!但如果我做一个归一化,它就会把数学四舍五入,MathFloor 就没有意义了。
在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。
也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12,这就是导致你绞尽脑汁的 "特殊性"。
在上面的例子中,数字是1156.12,这个数字在内存中被存储为1156.119999999999891。
也就是说,如果你试图四舍五入到百分之一,你会得到1156.11而不是1156.12--这就是你问题的 "特殊性"。
是的 :-)谢谢。