Ich verwende d3.format ("s") mit d3.svg.axis.tickFormat, um die Hilfsstrichsbeschriftungen mit SI-Einheiten (aus dem Internationalen Einheitensystem) schön zu formatieren. Es funktioniert in den meisten Fällen sehr gut, außer bei bestimmten Werten, die zu einem Rundungsfehler führen und eine Tonne Dezimalstellen zurückgeben (z. B. 1400 * 0,001 = 1.4000000000000001).
Um dies zu umgehen, kann ich eine Genauigkeit angeben, wie zB d3.format (". 2s"), aber dies erzwingt 2 signifikante Ziffern in Fällen, in denen 1 besser wäre. Zum Beispiel, wenn ich Ticks [5000, 10000, 15000] habe, würde ich jetzt [5.0k, 10k, 15k] sehen. Ursprünglich, als ich überhaupt keine Genauigkeit angegeben habe, habe ich [5k, 10k, 15k].
Ich frage mich, ob es möglich ist, eine maximale Genauigkeit anzugeben, so dass sie nur angewendet wird, wenn die Anzahl der signifikanten Ziffern die angegebene Anzahl überschreitet? 5000 wären also 5k und nicht 5.0k.
Sie können dies tun, indem Sie eine if / else-Anweisung in eine anonyme Funktion platzieren, in der Sie die Textzeichenfolge ausgeben würden. In diesem Fall können Sie jede gewünschte Bedingung erfüllen und eine Funktion erstellen, die Ihren Wert analysiert . Hier ist ein Beispiel:
%Vor%Ich hoffe, das hilft.
Während 1400 * .001 1,4000000000000001 ist, ist 1400/1000 1,4; das Multiplizieren einer ganzen Zahl mit einer negativen Zehnerpotenz (z. B. 0,001) kann einen Rundungsfehler verursachen, aber es scheint, dass das Dividieren einer ganzen Zahl durch eine Zehnerpotenz (z. B. 1000) nicht erfolgt. Oder zumindest ist es weniger wahrscheinlich? Ich habe eine vorläufige Lösung im Fix-Si-Format-Rundungszweig implementiert. Es ist streng rückwärtskompatibel, aber da die Funktion d3.formatPrefix
undokumentiert ist, wäre es sicher, sie in die nächste Patch-Version aufzunehmen.
Bearbeiten: Dieser Fix wurde in Version 2.9.2 veröffentlicht.
Tags und Links javascript svg format d3.js