我需要转换并将F舍入到C.我的功能很简单:
return (int)((((float)5 / (float)9) * (f - 32)) + 0.5)
但是如果我输入14 f,我会得到-9 c而不是-10 c。
答案 0 :(得分:2)
C有一个很好的函数lround()
来舍入并转换为整数。
lround和llround函数将它们的参数四舍五入到最接近的整数值,无论当前的舍入方向如何,都将中间情况四舍五入。 C11dr§7.12.9.72
#include <math.h>
return lround(5.0/9.0 * (f - 32));
+0.5而且施放到int
有各种各样的麻烦。当x +0.5
不准确时,对于负值并且对于各种边缘情况,它会错误地“舍入”并且舍入不正确。
使用<math.h>
轮次函数,rint()
,round()
,nearbyint()
等最佳工具。
OP关于需要 vxWorks 解决方案的评论。那显然有iround来完成这项工作。
对于否math.h
或double
解决方案:
使用(a + sign(a)*b/2)/b
成语。抵消32华氏度后,我们需要c = irounded(5*f/9)
或c = irounded(10*f/18)
。
int FtoC(int f) {
f -= 32;
if (f < 0) {
return (2*5*f - 9)/(2*9);
}
return (2*5*f + 9)/(2*9);
}
答案 1 :(得分:1)
((14 - 32) * 5.0) / 9.0 = -10.0
-10.0 + 0.5 = -9.5
(int)(-9.5) = -9
答案 2 :(得分:1)
添加0.5
以进行舍入目的仅在f - 32
的计算结果为正时才有效。如果结果为否定,则必须将其更改为-0.5
。
您可以将代码更改为:
int roundVal = (f < 32) ? -0.5 : 0.5;
return (int)((((float)5 / (float)9) * (f - 32)) + roundVal);
答案 3 :(得分:0)
每个人的
“Int()在数字的负区域无法正常工作 行“
完全错误,非常恶心!我们程序员应该了解并理解“数字线”的概念!
Int(9.5) == 10 => true
Int(-9.5) == -9 => true
假设我们有一个数据集,恰好是点5,并且是一个线性系统。 请记住,这是matlab语法,对我来说编程是编程,因此完全适用于任何语言。
x = [-9.5:1:9.5]%-9.5至9.5,增量为1 -9.5 -8.5 -7.5 ..... 9.5
% Now we need a function Int(), and lets say it rounds to the nearest,
% as y'all say it should be: "direction of the sign". MATLAB doesn't
% have
Int()... that I know of.
function INTEGER = Int_stupid(NUMBER)
POL = NUMBER / abs(NUMBER) % Polarity multiplier
VALUE_temp = NUMBER + (POL * 0.5) % incorrectly implemented
% rounding to the nearest
% A number divided by it's absolute value is 1 times it's
% polarity
% ( -9.5 / abs( -9.5 ) ) = -1
% ( 9.5 / abs( 9.5 ) ) = 1
end
function INTEGER = Int(NUMBER) % how every other Int function works
VALUE_temp = NUMBER + 0.5 % correctly implemented rounding
% to the nearest
end
%现在我们需要将整个数据集四舍五入到“符号的最近方向”
x_rounded = Int_stupid(x)=&gt; x = [ - 10,-9,-8,... -1,1,2 ......] %注意没有0,有 这种糟糕的四舍五入的不连续性。
% Notice that in the plot there is a zig,
% or zag, in my PERFECT LINEAR SYSTEM.
% Notice the two parallel lines with no
% defects representing the RAW linear
% system, and the parallel correctly
% rounded => floor( x + 0.5 )
舍入到最近的数据,如果正确完成,将与实际数据并行。
对不起我的愤怒和程序性侮辱。我希望专家能成为专家,不会出售完全错误的信息。如果我这样做,我期待同伴的羞辱=&gt; YOU。
参考文献(二年级如何舍入数字): %_HTTPS://math.stackexchange.com/questions/3448/rules-for-rounding-positive-and-negative-numbers %_HTTPS://en.wikipedia.org/wiki/IEEE_754#Rounding_algorithms
答案 4 :(得分:0)
听起来你有两个问题:
您尝试舍入的数字是否定的,这意味着添加0.5的标准技巧是错误的。
round()
之类的标准舍入函数由于某种原因而被拒绝。
所以,只需编写自己的:
double my_round(double x, double to_nearest)
{
if(x >= 0)
return (int)(x / to_nearest + 0.5) * to_nearest;
else
return (int)(x / to_nearest - 0.5) * to_nearest;
}
现在你可以写
了return (int)my_round(5./9. * (f - 32), 1.0);