标题: 这个C语言程序 数据类型转换是不是有什么问题? [打印本页]

作者: samxon    时间: 2024-4-21 17:51
标题: 这个C语言程序 数据类型转换是不是有什么问题?
请教大家,
下面的if(watt < jiyiwatt*(1-set3/100.0)) 这个判定有时有效,有时无效。

是不是数据类型转换的时候有问题。

#define uchar unsigned char
#define uint unsigned int

uint jiyiwatt,watt;
uchar set3=10;

if(watt < jiyiwatt*(1-set3/100.0)){ // set3是下调百分比
        state = 3;
        sdown = 0;
        }else {
        npp = 1;
        state = 1;
        }


作者: Hephaestus    时间: 2024-4-21 20:04
10/100=0这么简单的常识都不懂才会犯这种低级错误。
作者: samxon    时间: 2024-4-21 21:02
Hephaestus 发表于 2024-4-21 20:04
10/100=0这么简单的常识都不懂才会犯这种低级错误。

请问应该怎么修改一下
作者: Hephaestus    时间: 2024-4-21 21:07
samxon 发表于 2024-4-21 21:02
请问应该怎么修改一下

不知道你的数据范围,无法修改。
作者: fj51hei    时间: 2024-4-21 21:08
Hephaestus 发表于 2024-4-21 20:04
10/100=0这么简单的常识都不懂才会犯这种低级错误。

这个有小数点,愿意是不是弄小数点判断?
作者: Hephaestus    时间: 2024-4-21 21:26
fj51hei 发表于 2024-4-21 21:08
这个有小数点,愿意是不是弄小数点判断?

只要set3=10是整形(char/int/long),那么set3/100必然等于0,无论100有没有小数点。
作者: samxon    时间: 2024-4-21 21:34
Hephaestus 发表于 2024-4-21 21:07
不知道你的数据范围,无法修改。

set1的范围是1-99。得到的结果应转成整形。 jiyiwatt*(1-set3/100.0)应转成整形。谢谢!
作者: 1600277881    时间: 2024-4-21 21:54
if(watt < jiyiwatt*(1-set3/100.0))
改为
if(watt < (jiyiwatt*(1-set3)/100))
作者: Hephaestus    时间: 2024-4-21 22:52
1600277881 发表于 2024-4-21 21:54
if(watt < jiyiwatt*(1-set3/100.0))
改为
if(watt < (jiyiwatt*(1-set3)/100))

又错了,运算符乘除法比加减法优先级高,是小学就应该学过的。
作者: 1600277881    时间: 2024-4-21 23:03
Hephaestus 发表于 2024-4-21 22:52
又错了,运算符乘除法比加减法优先级高,是小学就应该学过的。

是的,这是看错了,应该是
if(watt < jiyiwatt*(1-set3/100.0))
if(watt < (jiyiwatt-jiyiwatt*set3/100.0))


作者: samxon    时间: 2024-4-21 23:12
set3是一个整数,程序原意是通过除100将百分比转换成小数,再用1减。
作者: samxon    时间: 2024-4-22 07:02
1600277881 发表于 2024-4-21 23:03
是的,这是看错了,应该是
if(watt < jiyiwatt*(1-set3/100.0))
if(watt < (jiyiwatt-jiyiwatt*set3/1 ...

watt < jiyiwatt*(1-set3/100.0))没什么区别吧。
作者: xiaobendan001    时间: 2024-4-22 07:17
要么int,要么char,为啥非要/100?把前边的数都*100,也就不用最后除100了,这样不就是都是int了?
作者: rayin    时间: 2024-4-22 07:32
c语言中, 整形变量可以比较大小, 浮点数据是不能直接比大小的. 这个也要注意.
作者: 人中狼    时间: 2024-4-22 07:34
数据强制类型转换
作者: samxon    时间: 2024-4-22 08:48
谢谢大家回复,大家能不能告诉一下,下面每一步算出来的数是什么类型,值是多少。
set3的取值范围是5-99,
这一步计算出来的值
jiyiwatt*(1-set3/100.0)


#define uchar unsigned char
#define uint unsigned int

uint jiyiwatt,watt;
uchar set3=10;



if(watt < jiyiwatt*(1-set3/100.0)){ // set3是下调百分比
        state = 3;
        sdown = 0;
        }else {
        npp = 1;
        state = 1;
        }
作者: Hephaestus    时间: 2024-4-22 11:27
jiyiwatt*(1-set3/100.0)改成
(jiyiwatt*(100-set3))/100
作者: 1600277881    时间: 2024-4-22 12:57
samxon 发表于 2024-4-22 07:02
watt < jiyiwatt*(1-set3/100.0))没什么区别吧。

你试过了么?试过后你再下结论吧
作者: samxon    时间: 2024-4-22 13:29
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))
作者: 1600277881    时间: 2024-4-22 14:06
samxon 发表于 2024-4-22 13:29
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))

如果说set3的范围是0..100, 这种写法解决不了,只是把你碰到的问题移位了,不信你试试
作者: 1600277881    时间: 2024-4-22 14:11
samxon 发表于 2024-4-22 13:29
这样似乎解决了,还在测试中,高手们看看到底解决没解决呢,
if(watt < (uint)(jiyiwatt*(100-set3)/100))

if(watt < (jiyiwatt-jiyiwatt*set3/100.0))

用excel 把范围设定好,对比一下这几个方式的误差就优劣了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1