Javascript-Rundungsnummer auf 0,5 genau

91


Kann mir jemand eine Idee geben, wie ich eine Zahl auf 0,5 runden kann?
Ich muss Elemente auf einer Webseite entsprechend der Bildschirmauflösung skalieren und dafür kann ich die Schriftgröße in Punkten nur 1, 1,5 oder 2 und mehr usw. zuweisen.

Wenn ich abrunde, rundet es entweder auf 1 Dezimalstelle oder auf keine. Wie kann ich diesen Job erledigen?

Johnydep
quelle

Antworten:

179

Schreiben Sie Ihre eigene Funktion, die mit 2 multipliziert, rundet und dann durch 2 dividiert, z

function roundHalf(num) {
    return Math.round(num*2)/2;
}
Newtron
quelle
Ich habe dies nur verwendet, um eine Reduzierungsfunktion für Geldwerte zu bereinigen, die mit 9 Dezimalstellen zurückkam ... (num * 100) / 100 funktionierte perfekt.
Dustin Kreidler
Wenn Sie entweder mit 13.0 oder 13.5 enden möchten, habe ich Ihre Antwort mit der folgenden kombiniert: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D
Das Runden der Zahl * 2 funktioniert nicht in allen Fällen. Wenn Sie eine Dezimalstelle wie 15.27 => verwenden, erhalten Sie => 15, wobei tatsächlich 15.5 hätte zurückgegeben werden müssen. **** Ich denke, dass die Verwendung von toFixed besser ist (num * 2) .toFixed () / 2
sfdx bomb
80

Hier ist eine allgemeinere Lösung, die für Sie nützlich sein kann:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2,7

round(2.74, 0.25) = 2,75

round(2.74, 0.5) = 2,5

round(2.74, 1.0) = 3,0

Michael Deal
quelle
1
Was heißt invdas Was invrepräsentiert die Variable?
Deilan
1
@ Deilan würde ich vermuten inverse.
Alex K
2

Math.round(-0.5)gibt 0 zurück , sollte aber gemäß den mathematischen Regeln -1 sein .

Weitere Informationen: Math.round () und Number.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}
Julia Savinkova
quelle
1
@Yuri Um das zu erweitern, was Sie sagen, wird roundauf die nächste Ganzzahl gerundet , die größer als der angegebene Wert ist, was in Bezug auf negative Zahlen dem positiven Ganzzahlspektrum entspricht. -2,5 würde zu -2 gehen. Ist das korrekt?
Danny Bullis
Yup gerade verifiziert. Math.ceil(-1.75) == -1und Math.floor(-1.75) == -2. Also für jedermann, die durch diese, man denke nur an sie als gestolpert ceilkehrt eine mehr als Zahl, floorliefert eine weniger als Zahl.
Danny Bullis
2

Erweiterung der Top-Antwort von newtron für Rundungen auf mehr als nur 0,5

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76
Ronan Stoffers
quelle
1
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

Ich habe das geschrieben, bevor ich Tunakis bessere Antwort gesehen habe;)

mekdigital
quelle
0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );
Blazes
quelle
3
Wenn f = 1,9, führt dies zu v = 1, was falsch ist.
Bogatyrjov