x * 0.1 和 x / 10 有什么区别?

3

我是一名高中学生,之前看到过一个说法,即乘法比除法更好。自那以后,我试图修改我的代码,使其稍微更快,但并没有找到任何证明它是否正确的证据,也不知道如何自己查找证据。

这里有一个问题,我想用递归来寻找数字中最大的数字。

这个代码可以正常运行。

#include <iostream>

using namespace std;

int minn = 9;

int digit(int n)
{
    if(minn > n % 10)
        minn = n % 10;
    if(!(n / 10))
        return minn;
    else
        return digit(n / 10);
}

int main()
{
    int x;
    cin >> x;
    cout << digit(x);
    return 0;
}

但这并没有起作用。

#include <iostream>

using namespace std;

int minn = 9;

int digit(int n)
{
    if(minn > n % 10)
        minn = n % 10;
    if(!(n * 0.1))
        return minn;
    else
        return digit(n / 10);
}

int main()
{
    int x;
    cin >> x;
    cout << digit(x);
    return 0;
} 

唯一的区别在于坏的代码使用了 if(!(n * 0.1)) 而不是 if(!(n / 10))
有人可以为我或任何需要帮助的人澄清一下 x * 0.1 和 x / 10 之间的区别吗?
感谢所有点击问题并尝试帮助的人!

1
如果您想了解像 x * 0.1 这样的调用中发生了什么,请查看算术运算符页面上的“转换”部分,并记住 10 是一个 int,而 0.1 是一个 double - Nathan Pierson
1
0.1 is a floating point number and n * 0.1 becomes a floating number too. First problem with it is that it doesn't do what you want if n == 123, then n * 0.1 is 12.3, not 3. The second problem is that floating numbers are not precise, you get a small small numeric error, so it's not actually 12.3, but maybe 12.29999999999 - Alexey Larionov
1
当处理数字时,考虑将数字读取为字符串。Digit_Value = text[x] - '0'。在我看来,比余数和除法运算要简单得多。 - Thomas Matthews
4个回答

6

0.1 是一个双精度浮点数类型,10 是一个整型类型。

当两个整数相除,比如 n / 10,你会得到整数除法(例如 6/10 将等于 0)。

但如果使用 6 * 0.1,结果将是不同的,因为它等于 0.6


3

n * .1的结果是浮点数。因此,3 * .1 的结果为 .3,这绝对不是 0。

另一方面,在 C++ 中整数除法的结果为 0,所以 3/10 等于 0。


1
您将x定义为intx*0.1使用浮点算术,而x/10使用整数算术。

1

有人能为我或任何需要帮助的人澄清一下x * 0.1和x / 10之间的区别吗?

差异非常显着。在第一种情况下,您使用浮点乘法,在第二种情况下使用整数除法。因此,第一个if()将在n == 0时发生,而第二个if()将在n < 10时发生。

if( !(n*0.1) ) // for if to work result of n * 0.1 must be equal 0 which only happens when n == 0

if( !(n/10) ) // for if to work result of n / 10 must be equal to 0 which happens when abs(n) < 10 (including 0)

“当 n < 10 时”并不完全正确。考虑当 n 为 -15 时,表达式 !(-15/10) 的值为 false。 - Wyck
@Wyck 你说得对,虽然在OP的情况下这不太可能是普遍真实的,但我已经更正了我的答案。谢谢。 - Slava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接