最有效的方法来获得double / float的第一个数字

时间:2015-02-16 07:13:24

标签: multilingual

例如,如果我有float / double变量:

float f = 1212512.028423;
double d = 938062.3453;
int f1 = 1; 
int d1 = 9;

获得这些数字的第一个数字的最快方法是什么?

int first_digit(double n) {
  while(n>10) n/=10;
  return n;
}

这是最有效的吗?

我需要一个不涉及char / string的实现,它也可以工作(或者以其特定语言提供最佳性能)。语言为RubyPythonC#JavaC++GoJavaScriptPHP

2 个答案:

答案 0 :(得分:1)

//Try this.
double d = 938062.3453;
int f1 = Int32.Parse(d.ToString().Substring(0, 1)); 

答案 1 :(得分:1)

以上提到的解决方案都会在编号-0.0123时崩溃。我出于不同的目的构造了一种不同的方法:

public static double InteligentRound(double X, int kam=0)
{           int zn = (X < 0) ? (-1) : (1);  //signum of the input
            X *= zn;  //we work with positive values only
            double exp = Math.Log10(X);  //exponent of 10
            exp = Math.Floor(exp);  
            double B = Math.Pow(10, exp);//the pure power of 10
            double FD = X / B;  //lies between 1 and 10
            if (kam == 0) FD = Math.Round(FD);
            if (kam < 0) FD = Math.Floor(FD);  //Now, FD is the first digit
            if (kam > 0) FD = Math.Ceiling(FD);
            return (zn * FD * B);
        }