bugfix> java > 投稿

コンテナに収まる列数を計算したい。最初に、いくつの列に収まるかを計算し、次にそれらのマージンの数を計算します。その後、それらがマージンに収まるかどうかをチェックします。そうでない場合は、列の量を1つ減らします。 コード:

int columnMargin = 50;
double result = columnContainerHBox/minimalColumnWidth;
int columnCount = (int) result; // here's the problem
int numberOfMargins = columnCount - 1;
double finalCount = columnContainerHBox/minimalColumnWidth*columnCount+columnMargin*numberOfMargins;
if(finalCount<1){
    columnCount--;
}

問題は、 double から変換する方法がわからないことです。 int へ丸め番号なし。小数点以下のすべての数値を削除する必要があります。私はすでに (int) double を試しました 、 (int)Math.floor(double) および new DecimalFormat('#').format(double) 。として私は1.99999999999999999999を取りました。上記はすべて2に変換していました。望ましい結果-1;

私の double 完全にランダムになります。 1.0、1.99999999999、2.45、3.5959547324などになります。

必要なのは、一部を取得し、10進数以降のすべてを完全に破棄することです。

double
回答 4 件
  • 試行として提示したコードで既に行っているように、intにキャストすることでそれを行います。

    あなたは、あなたの試みが小数部分を落とす代わりに値を丸める場合を見つけたと思うので、あなたが不満を感じると理解しています。

    値1.99999999999999999999で試してみましたが、intにキャストすると値2のintが生成されることに気付きました。そこから、キャストは小数部分を切り捨てるだけでなく、最も近い整数2に丸めていると結論付けました。

    あなたの結論は間違っています。数値2は、intへのキャストの結果として取得されません。数値2は、コンパイラーが書き込まれたリテラル値1.99999999999999999999を解析した結果です。 doubleの精度は無限ではありません。つまり、必要な数の小数を書き込むことができず、double値に正しく保持されることを期待できません。ダブルのみ提供近似値 あなたが求めているものの。したがって、リテラル値1.99999999999999999999を入力すると、コンパイラはその値を正確に表すことができないことを認識し、代わりに最も近い doubleで表現できる値。

    また、1.999999999999999999999999に最も近い表現可能な値は2です。Javaコンパイラに関する限り、これらの2つの数値は同一です。

    あなたが書くとき:

    double d = 1.99999999999999999999d;
    
    

    Javaコンパイラはそれを次のものと完全に同等に扱います。

    double d = 2d;
    
    

    この時点で、小数を切り捨てて全体を保持する試みをまだ行っていないことに気付くでしょう。倍精度浮動小数点数の値を宣言しただけであり、懸念している限り、この値は小数部分を持つ可能性があります。

    値全体を保持しようとする試みは、次の場合にのみ発生します。

    int i = (int)d;
    
    

    そして、ここでは小数が削除され、intにはdouble値に含まれるものの全体のみが含まれます。

    ただし、この例では、double値が2.0であるため、その全体を2にすると、丸められません。それは全体だけを保持すること以外の何ものでもありません。

    小数を削除し、一部のみを保持する正しい方法は、intにキャストすることです。

    (1.99999999999999999999などの値を操作して2.0と同じにしないことが重要な場合、doubleを使用することはできません。十分な精度がありません。BigDecimalをnew BigDecimal( "とともに使用する必要があります。 1.99999999999999999999 ")。浮動小数点値は必要な値を表すことができないため、コンストラクタは浮動小数点値ではなく文字列で呼び出す必要があります。)

  • Math.floor()  あなたが探しているものはhttps://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-

    Math.floorDiv()  あなたの場合にも役立つかもしれません。

  • 私はこれをしましたが、それは非常に良い解決策ではありませんが、私はそれを持っています:

    public class Main {
        public static void main(String args[]) {
            double d = 1.9999;
            String s = (""+d).contains(".") ? (""+d).substring(0, (""+d).indexOf(".")) : (""+d);
            System.out.println(Integer.parseInt(s));
        }
    }
    
    

  • 私があなたの問題を強調した場合、あなたはちょうど intValue() を使用することができます

あなたの答え