αλεχολυτ Asked:2020-10-05 05:06:53 +0800 CST2020-10-05 05:06:53 +0800 CST 2020-10-05 05:06:53 +0800 CST 除数时,小数部分消失 772 例如,我将两个数字相除,1 / 2我希望结果为0.5,因为我将结果分配给浮点变量,但我得到0. 这是代码: #include <iostream> int main() { double d = 1 / 2; std::cout << d << "\n"; } 0 可能是什么问题呢? c++ 2 个回答 Voted Best Answer αλεχολυτ 2020-10-05T05:06:53+08:002020-10-05T05:06:53+08:00 事实是,在 C++ 以及 C、C#、Java 和许多其他语言中,整数除法仅给出整数结果,即 小数部分被简单地丢弃。 语言标准字面意思是这样[expl.mul]: 对于整数操作数,/运算符产生代数商,丢弃任何小数部分; 这种行为主要是由于性能,因为。整数运算通常比浮点运算快。 整数除法的结果分配给浮点变量这一事实不会影响除法本身,因为 分配是在除法之后完成的。d我们只是用一个整数值初始化实变量0,这不会给我们一个非零小数部分的东西,例如预期0.5的。 为了仍然达到预期的结果,您需要执行真正的除法。为此,只需将至少一个操作数转换为真实类型即可。这可以通过不同的方式来完成。如果使用常量,则在其末尾添加一个点就足够了,例如: double d = 1 / 2.; 或者 double d = 1. / 2; 它看起来很简约,但有时有点奇怪,因为。在数学中,不使用这样的符号。为了更清楚,值得添加.0,我们得到: double d = 1.0 / 2; 如果使用命名整数变量而不是显式数字文字或返回整数类型的函数,则添加一个带零的点将不再解决问题,您需要执行不同的类型转换,即 做static_cast: int one = 1; int two() { return 2; } double d = static_cast<double>(one) / two(); 但是您也可以使用任何操作数 by 的乘法(或除法)1.0,它还将作为后续除法的操作数的结果转换为实数类型: double d = (one * 1.0) / two(); 另一种方法是添加(或减去)一个实零: double d = (one + 0.0) / two(); 但是,选项 withstatic_cast会更正确,因为。这种转换总是比普通的浮动常量更容易在程序文本中找到。 当然,如果我们谈论的是变量或函数,那么您可以简单地更改它们的类型: double one = 1; double two() { return 2; } double d = one / two(); 在这种情况下,我们不能忘记,one在two其他上下文中的使用也可以产生与以前不同的结果。因此,如果仅在某些特殊情况下需要,最好将任务本地化,而不是在真实类型的程序中毫无例外地做所有事情。 Maksym 2022-02-13T17:24:34+08:002022-02-13T17:24:34+08:00 这是整数的除法 tobish int 然后分配一个双精度值 因此,我们知道 1/2 = 0.5 ,在 int 中它是 0 ,因此输出 0 。
事实是,在 C++ 以及 C、C#、Java 和许多其他语言中,整数除法仅给出整数结果,即 小数部分被简单地丢弃。
语言标准字面意思是这样[expl.mul]:
这种行为主要是由于性能,因为。整数运算通常比浮点运算快。
整数除法的结果分配给浮点变量这一事实不会影响除法本身,因为 分配是在除法之后完成的。
d
我们只是用一个整数值初始化实变量0
,这不会给我们一个非零小数部分的东西,例如预期0.5
的。为了仍然达到预期的结果,您需要执行真正的除法。为此,只需将至少一个操作数转换为真实类型即可。这可以通过不同的方式来完成。如果使用常量,则在其末尾添加一个点就足够了,例如:
或者
它看起来很简约,但有时有点奇怪,因为。在数学中,不使用这样的符号。为了更清楚,值得添加
.0
,我们得到:如果使用命名整数变量而不是显式数字文字或返回整数类型的函数,则添加一个带零的点将不再解决问题,您需要执行不同的类型转换,即 做
static_cast
:但是您也可以使用任何操作数 by 的乘法(或除法)
1.0
,它还将作为后续除法的操作数的结果转换为实数类型:另一种方法是添加(或减去)一个实零:
但是,选项 with
static_cast
会更正确,因为。这种转换总是比普通的浮动常量更容易在程序文本中找到。当然,如果我们谈论的是变量或函数,那么您可以简单地更改它们的类型:
在这种情况下,我们不能忘记,
one
在two
其他上下文中的使用也可以产生与以前不同的结果。因此,如果仅在某些特殊情况下需要,最好将任务本地化,而不是在真实类型的程序中毫无例外地做所有事情。这是整数的除法 tobish int
然后分配一个双精度值
因此,我们知道 1/2 = 0.5 ,在 int 中它是 0 ,因此输出 0 。