2

小数を分数に変換しようとしています。10 進数は、小数点以下 4 桁までです。例:- 12.34 = 1234/100 12.3456 = 123456/10000

私のコード:-

#include <stdio.h>
int main(void) {
  double a=12.34;
  int c=10000;
  double b=(a-floor(a))*c;
  int d=(int)floor(a)*c+(int)b; 
  while(1) {
     if(d%10==0) {
    d=d/10;
    c=c/10;
 }
 else break;
  }
  printf("%d/%d",d,c);
 return 0;
}

しかし、正しい出力が得られません。10 進数は倍精度のみになります。どうすればよいか教えてください。

4

6 に答える 6

4

浮動小数点数が の場合、x10000 を超える分数の分子は の整数部分になり(x + 0.00005) * 10000ます。分数を最も単純な項に減らす (つまり、分子と分母の gcd で割る) かどうかは、あなた次第です。

于 2012-11-13T16:26:27.707 に答える
1
#include <stdio.h>

int main(void) {
    double a = 12.34;
    int c = 10000;
    double b = (a - floor(a)) * c;
    int d = (int)floor(a) * c + (int)(b + .5f); 
    printf("%f %d\n", b, d);

    while(1) {
       if(d % 10 == 0) {
           d = d / 10;
           c = c / 10;
       }
       else break;
    }
    printf("%d/%d\n", d, c);
    return 0;
}

問題は、b3400.00 を取得していたが、3399 を取得しているため、数値を 3400 に切り捨てることができるよう(int) bに追加する必要があることです。0.5

3400.00 を取得することは 3400 を取得することとは異なります。3400.00 は、数値が 3400 に丸められたことを意味します。そのため、(int) 3400.00 を実行すると、最も近い整数 (変換している数値より小さい) が 3399 であると想定されます。 0.5 からその数値まで、最も近い整数は 3400 になりました。

浮動小数点演算についてより深く理解したい場合は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことをお読みください。

于 2012-11-13T16:51:36.163 に答える
0

小数を分数にする C++ で作成されたアルゴリズム。

#include <iostream>
using namespace std;


// converts the string half of the inputed decimal number into numerical values
void converting (string decimalNumber, float& numerator, float& denominator )

{
float number;
string valueAfterPoint = decimalNumber.substr(decimalNumber.find(".") + 1,((decimalNumber.length() -1) )); // store the value after the decimal into a valueAfterPoint
cout << valueAfterPoint<< " "<< endl;
int length = valueAfterPoint.length(); //stores the length of the value after the decimal point into length

 numerator = atof(valueAfterPoint.c_str()); // converts the string type decimal number into a float value and stores it into the numerator

// loop increases the decimal value of the numerator and the value of denominator by multiples of ten as long as the length is above zero of the decimal

cout << length<< endl;
for (; length > 0; length--)
{
    numerator *= 10;

}
do
    denominator *=10;
    while  (denominator < numerator);

}

// simplifies the the converted values of the numerator and denominator into simpler values for          an easier to read output
  void simplifying (float& numerator, float& denominator)
{
int maximumNumber = 9; //Numbers in the tenths place can only range from zero to nine so the maximum number for a position in a poisitino for the decimal number will be nine

bool isDivisble; // is used as a checker to verify whether the value of the numerator has the       found the dividing number that will a value of zero

// Will check to see if the numerator divided denominator is will equal to zero



if(int(numerator) % int(denominator) == 0)
{
    numerator /= denominator;
    denominator = 1;
    return;
}


//check to see if the maximum number is greater than the denominator to simplify to lowest form
while (maximumNumber < denominator)
{
    maximumNumber *=10;
 }


// the maximum number loops from nine to zero. This conditions stops if the function isDivisible is true
for(; maximumNumber > 0; maximumNumber --)
{

    isDivisble = ((int(numerator) % maximumNumber == 0) && int(denominator)% maximumNumber == 0);
    cout << numerator << denominator <<" " <<endl;
    if(isDivisble)
    {
        numerator /= maximumNumber;  // when is divisible true numerator be devided by the max    number value for example 25/5 = numerator = 5

        denominator /= maximumNumber; //// when is divisible true denominator be devided by the max number value for example 100/5 = denominator = 20

    }
    // stop value if numerator and denominator is lower than 17 than it is at the lowest value
    int stop = numerator + denominator;

    if (stop < 17)
    {
        return;
    }
}
}
  int main()
{
string decimalNumber;
float numerator = 0;
float denominator = 1;

cout << "Enter the decimal number";
cin >> decimalNumber;

//convert function
converting(decimalNumber, numerator, denominator);


//call simplyfication funcition
simplifying(numerator, denominator);


cout<< "Fraction: "<< numerator << "/" << denominator<< endl;
 return 0; 

}
于 2014-10-29T06:00:07.127 に答える
0

これは興味深い質問です。「最大公約数」を計算する倍数の方法について読むことから始めたほうがよいと思います(http://en.wikipedia.org/wiki/Greatest_common_divisorは良い情報源です)。

ペンと紙で行うようにこれらの計算を行うクイック & ダーティ アルゴリズムを実装し、double がどのように表現されるか (符号、指数、仮数) を調べ、この表現を利用するようにアルゴリズムを改善します。

悲しいことに、あなたのコードを書かずにできることはこれ以上ありません。

于 2012-11-13T16:30:01.393 に答える