How to fix lighting banding artifacts?

On Windows with 5.4.4

A rough dielectric sphere with an albedo of (0,0,1) shows banding artifacts similar to quantization errors:

  • No Lumen, Nanite or TAA
  • The banding is independent of the mesh resolution
  • Happens with default lit surface material
  • Occurs with any light strength

  • GBuffer is set to use High Precision Normals
  • The mesh has correct normals and is set to Use High Precision Tangent Basis
  • Occurs with floating point render targets
  • Unaffected by shader float precision
  • Can be reproduced with a custom unlit shader that does Lambertian shading using the world normal and a light direction

  • The bands are oriented towards the light direction and get narrower as the normal diverges from the light direction
  • Happens with point lights and directional lights
  • Is not affected by shadow settings

  • Occurs with all albedos except maybe black but is most noticeable with blue
  • On a white sphere, the faint bands tend towards yellow

  • Occurs with the default post process pass as well as custom tonemapping
  • Occurs in the linear data if tonemapping is bypassed completely
  • A custom quantization dither applied before output gets rid of another type of banding but not this one

Why does this happen and how can it be fixed?