From b9bc79816d91d78439e7e59ba03d943fada3a64a Mon Sep 17 00:00:00 2001 From: Matt Bauman Date: Thu, 8 Jun 2017 02:41:07 -0500 Subject: [PATCH] Add support for round(T, x) where T <: Integer (and friends) --- src/Unitful.jl | 9 +++++++-- test/runtests.jl | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Unitful.jl b/src/Unitful.jl index 048ee688..dc3e47e7 100644 --- a/src/Unitful.jl +++ b/src/Unitful.jl @@ -870,11 +870,16 @@ end ==(x::Number, y::Quantity) = ==(y,x) <=(x::Quantity, y::Quantity) = <(x,y) || x==y -for f in (:floor, :ceil, :trunc, :round, :isinteger) - @eval ($f)(x::Quantity) = error("$($f) can only be well-defined for dimensionless ", +_dimerr(f) = error("$f can only be well-defined for dimensionless ", "numbers. For dimensionful numbers, different input units yield physically ", "different results.") +isinteger(x::Quantity) = _dimerr(isinteger) +isinteger(x::DimensionlessQuantity) = isinteger(uconvert(NoUnits, x)) +for f in (:floor, :ceil, :trunc, :round) + @eval ($f)(x::Quantity) = _dimerr(f) @eval ($f)(x::DimensionlessQuantity) = ($f)(uconvert(NoUnits, x)) + @eval ($f){T<:Integer}(::Type{T}, x::Quantity) = _dimerr(f) + @eval ($f){T<:Integer}(::Type{T}, x::DimensionlessQuantity) = ($f)(T, uconvert(NoUnits, x)) end zero(x::Quantity) = Quantity(zero(x.val), unit(x)) diff --git a/test/runtests.jl b/test/runtests.jl index ed91ae21..e4463219 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -776,10 +776,26 @@ end @test_throws ErrorException ceil(3.7m) @test_throws ErrorException trunc(3.7m) @test_throws ErrorException round(3.7m) + @test_throws ErrorException floor(Integer, 3.7m) + @test_throws ErrorException ceil(Integer, 3.7m) + @test_throws ErrorException trunc(Integer, 3.7m) + @test_throws ErrorException round(Integer, 3.7m) + @test_throws ErrorException floor(Int, 3.7m) + @test_throws ErrorException ceil(Int, 3.7m) + @test_throws ErrorException trunc(Int, 3.7m) + @test_throws ErrorException round(Int, 3.7m) @test floor(1.0314m/mm) === 1031.0 @test ceil(1.0314m/mm) === 1032.0 @test trunc(-1.0314m/mm) === -1031.0 @test round(1.0314m/mm) === 1031.0 + @test floor(Integer, 1.0314m/mm) === Integer(1031.0) + @test ceil(Integer, 1.0314m/mm) === Integer(1032.0) + @test trunc(Integer, -1.0314m/mm) === Integer(-1031.0) + @test round(Integer, 1.0314m/mm) === Integer(1031.0) + @test floor(Int16, 1.0314m/mm) === Int16(1031.0) + @test ceil(Int16, 1.0314m/mm) === Int16(1032.0) + @test trunc(Int16, -1.0314m/mm) === Int16(-1031.0) + @test round(Int16, 1.0314m/mm) === Int16(1031.0) end @testset "Sgn, abs, &c." begin