Skip to content

Commit 441a5c3

Browse files
committed
Add support for round(T, x) where T <: Integer (and friends)
1 parent ef27338 commit 441a5c3

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

src/Unitful.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -870,11 +870,16 @@ end
870870
==(x::Number, y::Quantity) = ==(y,x)
871871
<=(x::Quantity, y::Quantity) = <(x,y) || x==y
872872

873-
for f in (:floor, :ceil, :trunc, :round, :isinteger)
874-
@eval ($f)(x::Quantity) = error("$($f) can only be well-defined for dimensionless ",
873+
_dimerr(f) = error("$f can only be well-defined for dimensionless ",
875874
"numbers. For dimensionful numbers, different input units yield physically ",
876875
"different results.")
876+
isinteger(x::Quantity) = _dimerr(isinteger)
877+
isinteger(x::DimensionlessQuantity) = isinteger(uconvert(NoUnits, x))
878+
for f in (:floor, :ceil, :trunc, :round)
879+
@eval ($f)(x::Quantity) = _dimerr($f)
877880
@eval ($f)(x::DimensionlessQuantity) = ($f)(uconvert(NoUnits, x))
881+
@eval ($f){T<:Integer}(::Type{T}, x::Quantity) = _dimerr($f)
882+
@eval ($f){T<:Integer}(::Type{T}, x::DimensionlessQuantity) = ($f)(T, uconvert(NoUnits, x))
878883
end
879884

880885
zero(x::Quantity) = Quantity(zero(x.val), unit(x))

test/runtests.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,10 +776,26 @@ end
776776
@test_throws ErrorException ceil(3.7m)
777777
@test_throws ErrorException trunc(3.7m)
778778
@test_throws ErrorException round(3.7m)
779+
@test_throws ErrorException floor(Integer, 3.7m)
780+
@test_throws ErrorException ceil(Integer, 3.7m)
781+
@test_throws ErrorException trunc(Integer, 3.7m)
782+
@test_throws ErrorException round(Integer, 3.7m)
783+
@test_throws ErrorException floor(Int, 3.7m)
784+
@test_throws ErrorException ceil(Int, 3.7m)
785+
@test_throws ErrorException trunc(Int, 3.7m)
786+
@test_throws ErrorException round(Int, 3.7m)
779787
@test floor(1.0314m/mm) === 1031.0
780788
@test ceil(1.0314m/mm) === 1032.0
781789
@test trunc(-1.0314m/mm) === -1031.0
782790
@test round(1.0314m/mm) === 1031.0
791+
@test floor(Integer, 1.0314m/mm) === Integer(1031.0)
792+
@test ceil(Integer, 1.0314m/mm) === Integer(1032.0)
793+
@test trunc(Integer, -1.0314m/mm) === Integer(-1031.0)
794+
@test round(Integer, 1.0314m/mm) === Integer(1031.0)
795+
@test floor(Int16, 1.0314m/mm) === Int16(1031.0)
796+
@test ceil(Int16, 1.0314m/mm) === Int16(1032.0)
797+
@test trunc(Int16, -1.0314m/mm) === Int16(-1031.0)
798+
@test round(Int16, 1.0314m/mm) === Int16(1031.0)
783799
end
784800

785801
@testset "Sgn, abs, &c." begin

0 commit comments

Comments
 (0)