将Fahreinheit转换为Celsius

时间:2017-09-15 19:37:15

标签: c

我需要转换并将F舍入到C.我的功能很简单:

return (int)((((float)5 / (float)9) * (f - 32)) + 0.5)

但是如果我输入14 f,我会得到-9 c而不是-10 c。

5 个答案:

答案 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.hdouble解决方案:
使用(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,有                                 这种糟糕的四舍五入的不连续性。

Bad Rounding discontinuity

                            % Notice that in the plot there is a zig, 
                            % or zag, in my PERFECT LINEAR SYSTEM.

Good & Bad Rounding with RAW

                            % 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)

听起来你有两个问题:

  1. 您尝试舍入的数字是否定的,这意味着添加0.5的标准技巧是错误的。

  2. round()之类的标准舍入函数由于某种原因而被拒绝。

  3. 所以,只需编写自己的:

    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);