func funcRound(vals []Value, args Expressions, enh *EvalNodeHelper) Vector {
	vec := vals[0].(Vector)
	// round returns a number rounded to toNearest.
	// Ties are solved by rounding up.
	toNearest := float64(1)
	if len(args) >= 2 {
		toNearest = vals[1].(Vector)[0].Point.V
	}
	// Invert as it seems to cause fewer floating point accuracy issues.
	toNearestInverse := 1.0 / toNearest

	for _, el := range vec {
		v := math.Floor(el.V*toNearestInverse+0.5) / toNearestInverse
		enh.out = append(enh.out, Sample{
			Metric: enh.dropMetricName(el.Metric),
			Point:  Point{V: v},
		})
	}
	return enh.out
}
func funcRound(vals []Value, args Expressions, enh *EvalNodeHelper) Vector {
	vec := vals[0].(Vector)
	
	
	toNearest := float64(1)
	if len(args) >= 2 {
		toNearest = vals[1].(Vector)[0].Point.V
	}
	
	toNearestInverse := 1.0 / toNearest

	for _, el := range vec {
		v := math.Floor(el.V*toNearestInverse+0.5) / toNearestInverse
		enh.out = append(enh.out, Sample{
			Metric: enh.dropMetricName(el.Metric),
			Point:  Point{V: v},
		})
	}
	return enh.out
}
func funcRound ( vals [ ] Value , args Expressions , enh * EvalNodeHelper ) Vector { vec := vals [ 0 ] . ( Vector ) // round returns a number rounded to toNearest. // Ties are solved by rounding up. toNearest := float64 ( 1 ) if len ( args ) >= 2 { toNearest = vals [ 1 ] . ( Vector ) [ 0 ] . Point . V } // Invert as it seems to cause fewer floating point accuracy issues. toNearestInverse := 1.0 / toNearest for _ , el := range vec { v := math . Floor ( el . V * toNearestInverse + 0.5 ) / toNearestInverse enh . out = append ( enh . out , Sample { Metric : enh . dropMetricName ( el . Metric ) , Point : Point { V : v } , } ) } return enh . out }
// === round(Vector ValueTypeVector, toNearest=1 Scalar) Vector ===
=== round ( Vector ValueTypeVector toNearest = 1 Scalar ) Vector ===