Seems like an off-by-one error in checking the bounds.
import std.stdio, std.conv;
void main() {
auto foo = cast(ubyte) roundTo!uint(255.0);
writeln(foo); // 255: Works.
auto bar = roundTo!ubyte(254.0);
writeln(bar); // 254: Works.
auto baz = roundTo!ubyte(255.0); // Throws
}