我的数学怎么了?

时间:2012-04-15 06:52:30

标签: c floating-point int

我有一个涉及浮点数和整数的函数。当我运行代码时,结果出错了。当我为input_voltage输入4.3时,我得到小数的3803和HEX的EDB。正确的答案应该是3808和EE0。谁能告诉我可能会发生什么?

#include <stdio.h>

int digital_encoding(float voltage);

int main()
{
    float input_voltage;
    int valid, ch;

    do{
        printf("Please enter the input voltage between 0 and 5 volts: \n");
        valid = scanf("%f", &input_voltage);
        if(input_voltage <= 0){
            printf("Enter a number larger than 0! \n");
            valid = 0;
        }
        if(input_voltage >= 5){
            printf("Enter a number less than 5! \n");
            valid = 0;
        }
    }while(valid != 1);

    digital_encoding(input_voltage);
}
int digital_encoding(float voltage)
{
    int dig_encode;
    dig_encode = ((voltage + 5)*(4095/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", dig_encode, dig_encode);
    return dig_encode;
}

5 个答案:

答案 0 :(得分:6)

4095/10是409而不是409.5,这是整数算术,所以它是向下舍入的。

您可能正在寻找4095.0 / 10 [或只是409.5]

答案 1 :(得分:1)

我认为您可能需要将(4095/10)更改为(4095.0 / 10),否则您将对该比率进行整数运算,其余部分将被丢弃。

答案 2 :(得分:1)

问题出在这里:

 int dig_encode;
        dig_encode = ((voltage + 5)*(4095/10));

计算float中的结果,然后在使用之前将其强制转换为int。

dig_encode = (int)((voltage + 5)*(4095/10.0));

答案 3 :(得分:1)

问题在于:

int digital_encoding(float voltage)
{
    **int** dig_encode;
    dig_encode = ((voltage + 5)*(4095/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", dig_encode,    dig_encode);
    return dig_encode;
}

改为使用

int digital_encoding(float voltage)
{
    float dig_encode;
    dig_encode = ((voltage + 5)*(4095.00/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", (int)dig_encode, (int)dig_encode);
    return (int)dig_encode;
}

答案 4 :(得分:0)

4095/10的结果是 int ,所以它是409,而不是409.5。这是因为这两个数字都是 int 。要使结果浮动,您可以像4095.0/10

一样编写它