modf 返回 1 作为小数:
我有这个静态方法,它接收一个 double 并“剪切”其小数尾部,在点后留下两位数字。 几乎一直在工作。我注意到当 它收到 2.3,然后将其变为 2.29。 0.3、1.3、3.3、4.3 和 102.3 不会发生这种情况。 代码基本上将数字乘以 100,使用 modf 将整数值除以 100 并返回它。 这里的代码捕获这个特定的数字并打印出来:
static double dRound(double number) {
bool c = false;
if (number == 2.3)
c = true;
int factor = pow(10, 2);
number *= factor;
if (c) {
cout << " number *= factor : " << number << endl;
//number = 230;// When this is not marked as comment the code works well.
}
double returnVal;
if (c){
cout << " fractional : " << modf(number, &returnVal) << endl;
cout << " integer : " <<returnVal << endl;
}
modf(number, &returnVal);
return returnVal / factor;
}
它打印出:
number *= factor : 230
小数 : 1
整数 : 229
有谁知道为什么会发生这种情况以及我该如何解决这个问题? 谢谢,祝周末愉快。
I have this static method, it receives a double and "cuts" its fractional tail leaving two digits after the dot. works almost all the time. I have noticed that when
it receives 2.3 it turns it to 2.29. This does not happen for 0.3, 1.3, 3.3, 4.3 and 102.3.
Code basically multiplies the number by 100 uses modf divides the integer value by 100 and returns it.
Here the code catches this one specific number and prints out:
static double dRound(double number) {
bool c = false;
if (number == 2.3)
c = true;
int factor = pow(10, 2);
number *= factor;
if (c) {
cout << " number *= factor : " << number << endl;
//number = 230;// When this is not marked as comment the code works well.
}
double returnVal;
if (c){
cout << " fractional : " << modf(number, &returnVal) << endl;
cout << " integer : " <<returnVal << endl;
}
modf(number, &returnVal);
return returnVal / factor;
}
it prints out:
number *= factor : 230
fractional : 1
integer : 229
Does anybody know why this is happening and how can i fix this?
Thank you, and have a great weekend.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
请记住,浮点数不能精确地表示十进制数。 2.3 * 100 实际上给出 229.99999999999997。因此 modf 返回 229 和 0.9999999999999716。
但是,
cout
的格式默认仅显示小数点后 6 位的浮点数。因此 0.9999999999999716 显示为 1。您可以(粗略地)使用浮点值表示的误差上限来避免 2.3 错误:
结果: http://www.ideone.com/ywmua
Remember floating point number cannot represent decimal numbers exactly. 2.3 * 100 actually gives 229.99999999999997. Thus
modf
returns 229 and 0.9999999999999716.However,
cout
's format will only display floating point numbers to 6 decimal places by default. So the 0.9999999999999716 is shown as 1.You could use (roughly) the upper error limit that a value represents in floating point to avoid the 2.3 error:
Result: http://www.ideone.com/ywmua
这是一种不四舍五入的方法:
即使您想根据小数点后第三位四舍五入,这里有一个解决方案:
Here is a way without rounding:
Even if you want rounding according to 3rd digit after decimal point, here is a solution: