2012-04-20 2 views
3

私は、数学を使用せずに、未知の量の数に小数点2桁を移動させたいと思っています。私はそれが変わっているのは分かっていますが、有限の精度はいくつかのシフトを引き起こします。私のjavascriptは強くはありませんが、可能であれば、数字を切り詰めてこれを行う方法を学びたいと思っています。だから、私は素晴らしい人たちが助けてくれることを願っています。私は数学と乗算を使用している場合59.89583333333334% JavaScriptを使用せずに小数点を移動することはできますか?

  • 問題:コンソール

  • を使用して= 0.5989583333333334

    • 960分の575 Iは、コピーやpastable割合のようなことをしたいと思います有限精度のため、59.895833333333336を返します。

    文字列を作成する方法はありますか?常にm小数点以下2桁を右に移動して数式をスキップしますか?

    ここでのコードで、あまりにもフィドルです:http://jsfiddle.net/dandenney/W9fXz/

    あなたは私がそれを必要とする理由を知りたいと精度が必要な場合、それは私が計算機を使用せずに応答割合を取得するために作られたこの小さなツールのためです:http://responsv.com/flexible-math

  • +0

    あなたは4K xよりおそらく小さいディスプレイを備えたWebブラウザで作業していることを忘れないでください4Kピクセル。おそらく5〜6桁の精度であればどんな計算でも十分でしょう。 – sarnold

    +0

    あなたは 'toFixed'と考えましたか?例えば'(575/960).toFixed(4)'は0.5989(文字列として)です。それは(よりきれいに言及することはありませんが)作業する方が簡単かもしれません。 –

    +0

    なぜ本当に簡単なのですか?あなたは 'var numb = 0.123;毎回左に2つのスペースを移動するために簡単に100で除算を使うことができます。 var newNumb = numb/100'である。それは本当に難しいことですか? – SpYk3HH

    答えて

    4

    元の数は、既知の構造のこのタイプのものであり、常に小数点の右側に少なくとも2桁を持っている場合、あなたはこのようにそれを行うことができます。

    function makePercentStr(num) { 
        var numStr = num + ""; 
        // if no decimal point, add .00 on end 
        if (numStr.indexOf(".") == -1) { 
         numStr += ".00"; 
        } else { 
         // make sure there's at least two chars after decimal point 
         while (!numStr.match(/\.../)) { 
          numStr += "0";   
         } 
        } 
        return(numStr.replace(/\.(..)/, "$1.") 
          .replace(/^0+/, "") // trim leading zeroes 
          .replace(/\.$/, "") // trim trailing decimals 
          .replace(/^$/, "0") // if empty, add back a single 0 
          + "%"); 
    } 
    

    の作業のデモをテストケースの場合:http://jsfiddle.net/jfriend00/ZRNuw/

    +1

    4/2では動作しません。 「2」は200%ではなく2になるからです。 –

    +0

    ありがとう、これは間違いなく動作します!私はそれをやっている方法のために、私は最初に文字列に変換しなければならなかったが、それからBOOM! –

    +0

    私は答えの最初の文章で正しいと言ったように - それは彼らが尋ねたような小数の右側に2桁の数字のために働く。すべての可能な入力番号に対して機能する必要がある場合は、よりスマートにすることができます。 – jfriend00

    1

    問題は数学を使わないで問題を解決するよう求められますが、以下の解は数学を含んでいます。私はaccepted answerと同じテストケースと

    function convertToPercentage(num) { 
        //Changes the answer to string for checking 
        //the number of decimal places. 
        var numString = num + ''; 
        var length = (numString).substring(numString.indexOf(".")+1).length; 
    
        //if the original decimal places is less then 
        //no need to display decimals as we are multiplying by 100 
        //else remove two decimals from the result 
        var precision = (length < 2 ? 0 : length-2); 
    
        //if the number never contained a decimal. 
        //Don't display decimal. 
        if(numString.indexOf(".") === -1) { 
         precision = 0; 
        }   
        return (num * 100).toFixed(precision) + "%"; 
    }   
    

    Working jsFiddleここだけの参照のためにそれを残しています。

    0

    私はので、フローティングエラーのリスクのこのメソッドを使用しました:

    const DECIMAL_SEP = '.'; 
     
    
     
    function toPercent(num) { 
     
        const [integer, decimal] = String(num).split(DECIMAL_SEP); 
     
    
     
        // no decimal, just multiply by 100 
     
        if(typeof decimal === 'undefined') { 
     
        return num * 100; 
     
        } 
     
    
     
        const length = decimal.length; 
     
    
     
        if(length === 1) { 
     
        return Number(integer + decimal + '0'); 
     
        } 
     
    
     
        if(length === 2) { 
     
        return Number(integer + decimal); 
     
        } 
     
    
     
        // more than 2 decimals, we shift the decimal separator by 2 
     
        return Number(integer + decimal.substr(0, 2) + DECIMAL_SEP + decimal.substr(2)); 
     
    } 
     
    
     
    console.log(toPercent(10)); 
     
    console.log(toPercent(1)); 
     
    console.log(toPercent(0)); 
     
    console.log(toPercent(0.01)); 
     
    console.log(toPercent(0.1)); 
     
    console.log(toPercent(0.12)); 
     
    console.log(toPercent(0.123)); 
     
    console.log(toPercent(12.3456));