我正在尝试用C ++进行一个非常简单的计算
double area()
{
return (base*height)/2;
}
其中base
和height
的类型为int
- 但我提供的base
和height
值5
和5
(它们在文件的前面声明) - 我回来12
,当我应该考虑12.5
返回类型时返回double
。
我是否正确使用了回报,或者我应该尝试使用setprecision()
或在返回前尝试施放?
答案 0 :(得分:4)
由于base
,height
和2
都是int
,(base*height)/2
的结果也是int
(12
此处),返回时将double
投放到12.0
。
更改
return (base*height)/2;
到
return (base*height)/2.0;
(base*height)/2.0
的结果为double
,因为2.0
是双倍的,您现在可以获得12.5
。
或者@Ajay指出,将base
或height
投射到double
以避免潜在的整数溢出。如,
return (static_cast<double>(base)*height)/2;
答案 1 :(得分:1)
你在这里执行整数除法,因为除法的两个参数都是整数。
之后的强制转换不会有帮助,但将其中一个参数转换为float / double会。
最简单的是写:
return (base*height)/2.;
(2之后的点使其成为双精度,这使得编译器选择浮点除法而不是整数除法)
答案 2 :(得分:1)
如果所有项都是int,则执行整数除法,并通过返回将结果(整数)强制转换为double。尝试使用2.0
代替,或乘以0.5
并避免分割。
答案 3 :(得分:1)
这样做:
double area()
{
return ((double)base*height)/2;
}
<强>为什么吗
整个表达式为int
,结果为int
。
double x = 100/3;
您可能会33.0
而不是33.33333
。您需要至少将一个操作数设为double
:
答案 4 :(得分:0)
显式类型转换
double area()
{
return (base*height)/2.0; //at least make any one of the operand double
//or return (double(base*height))/2; external typecasting of base*height
//or return (double(base)*height)/2; external typecasting of base
}
简单注意: 当您定义函数时,您有责任返回指定数据类型中的值,否则编译器将执行隐式类型转换,这可能导致精度损失。
有关更多信息,请访问此链接:http://www.cprogramming.com/tutorial/c/lesson11.html