anchor.diff:  
       for (int i=0; i<affix.length; i++) {
           if (value < Math.pow(1000, i+1)) {
  -            return "${neg?"-":""}${value ~/ Math.pow(1000, i)}${affix[i]}";
  +            double val = value / Math.pow(1000, i);
  +            String valstring = val.toStringAsFixed(1);
  +            if (valstring.endsWith(".0")) {
  +                valstring = val.floor().toString();
  +            }
  +            return "${neg?"-":""}$valstring${affix[i]}";
           }
       }
       return "!!!";
  
positive.code:         for (int turn=1; turn<=maxturn; turn++) {
              Iterable<DataPoint> thisturn = this.filtered.where((DataPoint p) => p.time == turn);
  
              double total = 0.0;
              for (Stat stat in parent.stats.values) {
                  double stattotal = 0.0;
  
negative.code:         CanvasElement canvas = querySelector("#canvas");
  
          CanvasRenderingContext2D ctx = canvas.context2D;
          ctx.fillStyle="#FFFFFF";
          ctx.fillRect(0, 0, canvas.width, canvas.height);
  
          if (this.data.isEmpty || this.plots.where((StatDataPlot p) => p.enabled).isEmpty) { return; }
  
  