0

質問を説明するのは難しいです。小数点以下の値を四捨五入せずに double の数値を整数に変換したいと思います。例えば

double a = 123.456

なりたい

int b = 123456

桁数が知りたいので、計算したら後ろにずらすと123.456

PS:この問題の性質を計算せずに、純粋な数学的方法でこの問題を解決したいだけです。

4

5 に答える 5

12

123.456 という数値は double として存在しないため、問題の解決策はありません。小数点を削除すると、この数値は明らかにどの整数型にも適合しません。

123.456 を正確な数値 123.456 として扱いたい場合、リモートで簡単にこれを行う唯一の方法は、文字列に変換し、文字列から小数点を削除することです。これは次のようなもので達成できます

snprintf(buf, sizeof buf, "%.13f", 123.456);

ただし、実際に印刷したい場所の数を把握することはかなり困難です. 使用しすぎると、上で示した正確な値の一部を取得することになります。使用するものが少なすぎると、保持したい場所が失われることは明らかです。

于 2013-07-05T05:01:25.727 に答える
0

これを行う標準的な方法は次のようになると思います

#include <math.h>
#include <stdio.h>

int main()
{
  double d = 123.456;
  double int_part;
  double fract_part;

  fract_part = modf(d, &int_part);

  int i = (int)int_part*1000 + (int)(fract_part*1000);

  printf("%d", i);
}

ここで、リテラル 1000 は、目的の小数点以下の桁数を決定する定数です。

于 2013-07-05T06:35:52.147 に答える
0

テキストがある場合は"123.456"、小数点を削除して、結果のテキスト表現を整数値に変換するだけです。すでにテキストを浮動小数点値 ( double a = 123.456;) に変換している場合、すべての賭けはオフです。浮動小数点値は 2 進分数として表されるため、事前に設定された 10 進数の桁数はありません。これは、通常の使用法では 1/3 と .3333 のようなものです。通常、.3333 は 1/3 を意味するふりをしますが、これらは同じ値ではありません。

于 2013-07-05T10:23:48.070 に答える